我有一个如下查询
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。但是,由于hibernate状态不允许在没有关联的情况下进行左联接,因此我必须使用本机SQL查询。
目前,我正在遍历JDBC样式的结果集并填充DTO对象。有没有更简单的方法来实现它?
您也许可以使用结果转换器。引用Hibernate3.2:HQL和SQL的变压器:
SQL变形金刚 使用本机sql返回非实体bean或Map通常比basic更为有用Object[]。使用结果转换器,现在成为可能。
使用本机sql返回非实体bean或Map通常比basic更为有用Object[]。使用结果转换器,现在成为可能。
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”)。这也可以通过搜索属性名称而不是使用完全匹配的自定义转换器来解决-也许我们应该提供FuzzyAliasToBean()方法;)
addScalar()