使用Hibernate中的原生SQL查询将结果集导入DTO [英] getting result set into DTO with native SQL Query in Hibernate

查看:410
本文介绍了使用Hibernate中的原生SQL查询将结果集导入DTO的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类似于下面的查询

  select f.id,s.name,ss.name 
from第一个f
在f.id = s.id中加入第二个s
在f.sId = ss.id中加入第二个ss

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



目前我正在循环以JDBC风格设置结果集并填充DTO对象。
有没有更简单的方法来实现它?

解决方案

你也许可以使用结果转换器。引用 Hibernate 3.2:用于HQL的变形金刚和SQL
$ b


SQL变换器



使用原生sql返回非-entity
beans或Map通常更有用
而不是基本的 Object []
结果变换器现在可以

$ b $ pre $ 列表resultWithAliasedBean = s.createSQLQuery(
SELECT st.name as studentName,co.description as courseDescription+
FROM Enrollment 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()方法;)




引用




I have a query like below

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

If I could use HQL, I would have used HQL constructor syntax to directly populate DTO with the result set. But, since hibernate doesn't allow left join without having an association in place I have to use the Native SQL Query.

Currently I am looping through the result set in JDBC style and populating DTO objects. Is there any simpler way to achieve it?

解决方案

You could maybe use a result transformer. Quoting Hibernate 3.2: Transformers for HQL and SQL:

SQL Transformers

With native sql returning non-entity beans or Map's is often more useful instead of basic Object[]. With result transformers that is now possible.

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);

Tip: the addScalar() calls were required on HSQLDB to make it match a property name since it returns column names in all uppercase (e.g. "STUDENTNAME"). This could also be solved with a custom transformer that search the property names instead of using exact match - maybe we should provide a fuzzyAliasToBean() method ;)

References

这篇关于使用Hibernate中的原生SQL查询将结果集导入DTO的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆