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

时间:2010-10-14 20:11:25

标签: java hibernate orm native-sql resulttransformer

我有一个如下的查询

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

如果我可以使用HQL,我会使用HQL constructor syntax直接用结果集填充DTO。 但是,由于hibernate不允许左连接而没有关联,我必须使用本机SQL查询。

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

1 个答案:

答案 0 :(得分:59)

您可以使用结果转换器。引用Hibernate 3.2: Transformers for HQL and 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);
     

提示:addScalar()来电是   HSQLDB上需要使其匹配a   属性名称,因为它返回列   全部大写的名称(例如   “学生姓名”)。这也可能是   解决了定制变压器   搜索属性名称而不是   使用完全匹配 - 也许我们应该   提供fuzzyAliasToBean()方法;)

参考