在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<?> result
转换为DTO
对象列表(例如DQCategoryDTO),而无需使用任何循环、迭代器和调用setter/getter来填充值?
4条答案
按热度按时间jv2fixgn1#
将投影Map到DTO结果集的选项有很多:
使用元组和JPQL的DTO投影
使用构造函数表达式和JPQL的DTO投影
您还可以从JPA构造函数表达式中省略DTO包名,并通过其简单的Java类名(例如
PostDTO
)引用DTO。一个一个二个一个一个一个三个一个一个一个一个一个四个一个
使用元组和本机SQL查询的DTO投影
这一个可以从Hibernate 5.2.11中获得,所以还有一个升级的理由。
使用ConstructorResult的DTO投影
如果我们使用前面介绍的相同
PostDTO
类类型,则必须提供以下@SqlResultSetMapping
:现在,执行名为native query的SQL投影,如下所示:
使用ResultTransformer和JPQL的DTO投影
这一次,您的DTO需要Hibernate从底层JDBC
ResultSet
填充的属性的setter。DTO投影如下所示:
使用ResultTransformer和本机SQL查询的DTO投影
2w3rbyxf2#
您可以使用ResultTransformer,它可以将别名转换为Bean(DTO)属性。有关用法,请参阅Hibernate文档here的第13.1.5节
c7rzv4ha3#
这正是Blaze-Persistence实体视图创建的用例!
您的DTO看起来像
如果您使用Spring Data,则可以在存储库中使用它,例如
v8wbuo2f4#
以下是如何使用投影基于街道名称将地址分组在一起的完整示例。
SomeDTO列表将包含按streetName分组结果数量。每个SomeDTO对象包含街道名称和街道中的公寓数量。
SomeDTO.java