一尘不染

将JPA或Hibernate投影查询映射到DTO(数据传输对象)

hibernate

在我的DAO层中,我有一个类似的Find函数

public List<?> findCategoryWithSentenceNumber(int offset, int maxRec) {
  Criteria crit = getSession().createCriteria(Category.class, "cate");
    crit.createAlias("cate.sentences", "sent");

    crit.setProjection(Projections.projectionList().
    add(Projections.property("title"), "title").
    add(Projections.count("sent.id"), "numberOfSentence").
    add(Projections.groupProperty("title"))
  );

  crit.setFirstResult(offset);
  crit.setMaxResults(maxRec);

  return crit.list();
}

因此,为了读取数据,我必须使用Loop(带有Iterator

List<?> result = categoryDAO.findCategoryWithSentenceNumber(0, 10);
// List<DQCategoryDTO> dtoList = new ArrayList<>();

for (Iterator<?> it = result.iterator(); it.hasNext(); ) {
  Object[] myResult = (Object[]) it.next();

  String  title = (String) myResult[0];
  Long count = (Long) myResult[1];


  assertEquals("test", title); 
  assertEquals(1, count.intValue());

  // dQCategoryDTO = new DQCategoryDTO();
  // dQCategoryDTO.setTitle(title);
  // dQCategoryDTO.setNumberOfSentence(count);
  // dtoList.add(dQCategoryDTO);

}

我的问题是:是否有任何api框架可以轻松地将其转换List<?> resultDTO对象列表(例如DQCategoryDTO),而无需使用任何循环,迭代器和调用setter / getter来填充值?


阅读 480

收藏
2020-06-20

共1个答案

一尘不染

您可以使用ResultTransformer,它可以从别名转换为bean(DTO)属性。对于用法,您可以在此处的Hibernate文档第13.1.5节中找到。

2020-06-20