Return 实体对象或 POJO 到 UI?
Return Entity object or POJO to UI?
我有 JPA Employee
持久实体,它有 50 个字段。有时我需要将所有 50 个字段显示到 UI 或有时比这少得多。
我能想到两种方法
方法一:-
我将继续 return Employee
实体到 UI。有一些方法(带注释)我可以提到 Employee
下的哪些特定字段需要 returned
示例:-
如果我想在 returning json 到浏览器之前忽略来自员工 class 的 MiddleName
,我将创建 EmployeeMixin
需要 @JsonIgnoreProperties
如下所示
@JsonIgnoreProperties({"MiddleName"})
public abstract class EmployeeMixin extends Employee{
}
Employee employee = new Employee ();
Map<Class<?>, Class<?>> mixinMap = new HashMap<Class<?>, Class<?>>();
mixinMap.put(Employee.class, EmployeeMixin.class);
ObjectMapper mapper = new ObjectMapper(mixinMap);
return mapper.writeValueAsString(employee);
方法二:-
我将创建新的 POJO,再次包含所有 5o 个字段并返回到 UI。
我的问题是哪种设计方法更好?我应该 return 实体对象或新的 Pojo 对象(从实体构造)到 UI 吗?
我更喜欢方法 3、投影
- 为每个案例创建一个
DTO
对象,其中包含您需要的一组可变字段。
- 创建相应的
JPQL
或CriteriaQuery
以填充适当的DTO
。
entity
喜欢
@Entity
@Getter
public class Pojo3 {
@Id
@GeneratedValue
private Long id;
@Setter
private String f1, f2,f3;
}
您可以制作一个 DTO
class 字段子集,例如
@Getter @Setter
@AllArgsConstructor // Pojo2DTO(id,f1,f2)
public class Pojo2DTO {
private Long id;
private String f1,f2;
}
可以在 JPQL
中填充,就像这个测试显示的
@Test
@Transactional
public void test() {
Pojo3 pojo3 = new Pojo3();
pojo3.setF1("f1");
pojo3.setF2("f2");
pojo3.setF3("f3");
em.persist(pojo3);
// **NOTE** the full package path to DTO object
TypedQuery<Pojo2DTO> tq = em.createQuery(
"SELECT NEW org.example.jpa.manyfields.Pojo2DTO(p3.id, p3.f1, p3.f2) "
+ " FROM Pojo3 p3 WHERE p3.id=:id", Pojo2DTO.class);
tq.setParameter("id", pojo3.getId());
Pojo2DTO pojo2dto = tq.getSingleResult();
log.info("{}, {}, {}", pojo2dto.getId(), pojo2dto.getF1(), pojo2dto.getF2());
}
我有 JPA Employee
持久实体,它有 50 个字段。有时我需要将所有 50 个字段显示到 UI 或有时比这少得多。
我能想到两种方法
方法一:-
我将继续 return Employee
实体到 UI。有一些方法(带注释)我可以提到 Employee
下的哪些特定字段需要 returned
示例:-
如果我想在 returning json 到浏览器之前忽略来自员工 class 的 MiddleName
,我将创建 EmployeeMixin
需要 @JsonIgnoreProperties
如下所示
@JsonIgnoreProperties({"MiddleName"})
public abstract class EmployeeMixin extends Employee{
}
Employee employee = new Employee ();
Map<Class<?>, Class<?>> mixinMap = new HashMap<Class<?>, Class<?>>();
mixinMap.put(Employee.class, EmployeeMixin.class);
ObjectMapper mapper = new ObjectMapper(mixinMap);
return mapper.writeValueAsString(employee);
方法二:-
我将创建新的 POJO,再次包含所有 5o 个字段并返回到 UI。
我的问题是哪种设计方法更好?我应该 return 实体对象或新的 Pojo 对象(从实体构造)到 UI 吗?
我更喜欢方法 3、投影
- 为每个案例创建一个
DTO
对象,其中包含您需要的一组可变字段。 - 创建相应的
JPQL
或CriteriaQuery
以填充适当的DTO
。
entity
喜欢
@Entity
@Getter
public class Pojo3 {
@Id
@GeneratedValue
private Long id;
@Setter
private String f1, f2,f3;
}
您可以制作一个 DTO
class 字段子集,例如
@Getter @Setter
@AllArgsConstructor // Pojo2DTO(id,f1,f2)
public class Pojo2DTO {
private Long id;
private String f1,f2;
}
可以在 JPQL
中填充,就像这个测试显示的
@Test
@Transactional
public void test() {
Pojo3 pojo3 = new Pojo3();
pojo3.setF1("f1");
pojo3.setF2("f2");
pojo3.setF3("f3");
em.persist(pojo3);
// **NOTE** the full package path to DTO object
TypedQuery<Pojo2DTO> tq = em.createQuery(
"SELECT NEW org.example.jpa.manyfields.Pojo2DTO(p3.id, p3.f1, p3.f2) "
+ " FROM Pojo3 p3 WHERE p3.id=:id", Pojo2DTO.class);
tq.setParameter("id", pojo3.getId());
Pojo2DTO pojo2dto = tq.getSingleResult();
log.info("{}, {}, {}", pojo2dto.getId(), pojo2dto.getF1(), pojo2dto.getF2());
}