38

我有一个如下查询

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 构造函数语法直接用结果集填充 DTO。但是,由于休眠不允许在没有关联的情况下进行左连接,因此我必须使用本机 SQL 查询。

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

4

1 回答 1

64

您也许可以使用结果转换器。引用Hibernate 3.2:HQL 和 SQL 的转换器

SQL 转换器

使用本机 sql 返回非实体 bean 或 Map 通常比 basic 更有用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 需要调用以使其匹配属性名称,因为它返回全大写的列名称(例如“STUDENTNAME”)。这也可以通过自定义转换器来解决,该转换器搜索属性名称而不是使用精确匹配 - 也许我们应该提供一个 blurAliasToBean() 方法;)

参考

于 2010-10-14T20:58:29.163 回答