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

发布于 2024-09-27 08:46:28 字数 434 浏览 2 评论 0原文

我有一个如下查询

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 对象。 有没有更简单的方法来实现?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

救星 2024-10-04 08:46:28

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

SQL 转换器

使用本机 sql 返回非实体
beans 或 Map 通常更有用
而不是基本的Object[]。和
现在的结果转换器
有可能。

列出 resultWithAliasedBean = s.createSQLQuery(
  "选择 st.name 作为学生姓名,co.description 作为课程描述 " +
  “来自注册 e” +
  "INNER JOIN Student st on e.studentId=st.studentId " +
  “e.courseCode=co.courseCode 上的 INNER JOIN 课程 co”)
  .addScalar("学生姓名")
  .addScalar(“课程描述”)
  .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
  。列表();

StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0);

提示:addScalar() 调用是
HSQLDB 需要使其匹配
属性名称,因为它返回列
名称全部大写(例如
“学生姓名”)。这也可以是
使用自定义变压器解决了
搜索属性名称而不是
使用精确匹配 - 也许我们应该
提供一个 fuzzyAliasToBean() 方法;)

参考文献

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文