在Hibernate中使用本机SQL查询将结果集添加到DTO中

Red*_*ddy 37 java orm hibernate resulttransformer native-sql

我有一个如下查询

select f.id, s.name, ss.name
from first f
left join second s on f.id = s.id
left join second ss on f.sId = ss.id
Run Code Online (Sandbox Code Playgroud)

如果我可以使用HQL,我会使用HQL构造函数语法直接用结果集填充DTO.但是,由于hibernate不允许左连接而没有关联,我必须使用Native SQL Query.

目前,我循环遍历JDBC样式的结果集并填充DTO对象.有没有更简单的方法来实现它?

Pas*_*ent 61

你可以使用结果转换器.引用Hibernate 3.2:HQL和SQL的变换器:

SQL变形金刚

使用本机sql返回非实体bean或Map通常更有用而不是基本Object[].现在可以使用结果变换器.

List resultWithAliasedBean = s.createSQLQuery(
  "SELECT st.name as studentName, co.description as courseDescription " +
  "FROM Enrolment e " +
  "INNER JOIN Student st on e.studentId=st.studentId " +
  "INNER JOIN Course co on e.courseCode=co.courseCode")
  .addScalar("studentName")
  .addScalar("courseDescription")
  .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
  .list();

StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0);
Run Code Online (Sandbox Code Playgroud)

提示:addScalar()HSQLDB上需要调用以使其与属性名称匹配,因为它以全部大写形式返回列名(例如"STUDENTNAME").这也可以与搜索属性名称,而不是使用精确匹配定制的变压器解决-也许我们应该提供一个fuzzyAliasToBean()方法)

参考