将实体对象或POJO返回给UI?

问题描述 投票:0回答:1

我有JPA Employee持久性实体wjich有50个字段。有时候我需要向UI显示所有50个字段,或者有时候要少得多。

我能想到两种方法

方法1: -

我将继续将Employee实体返回给UI。有一些方法(带注释),我可以提到需要返回Employee下的哪些特定字段

示例: -

如果我想在将json返回浏览器之前忽略Employee类中的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);

方法2: -

我将再次创建包含所有5o字段的新POJO并返回UI。

我的问题是哪种更好的设计方法?我应该将Entity对象或新的Pojo对象(由Entity构造)返回给UI吗?

java hibernate jpa pojo
1个回答
0
投票

我更喜欢方法3,投影

  • 使用您需要的一组可变字段为每个案例创建一个DTO对象。
  • 创建一个相应的JPQLCriteriaQueryto填充适当的DTO

entity一样

@Entity
@Getter
public class Pojo3 {
   @Id
   @GeneratedValue
   private Long id;
   @Setter
   private String f1, f2,f3;
}

你可以制作一个DTO类与字段的子集,如

@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());

}
© www.soinside.com 2019 - 2024. All rights reserved.