【问题标题】:getting result set into DTO with native SQL Query in Hibernate在 Hibernate 中使用本机 SQL 查询将结果集放入 DTO
【发布时间】:2011-04-25 15:02:56
【问题描述】:

我有如下查询

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。 但是,由于休眠不允许在没有关联的情况下进行左连接,因此我必须使用本机 SQL 查询。

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

【问题讨论】:

    标签: java hibernate orm native-sql resulttransformer


    【解决方案1】:

    您也许可以使用结果转换器。引用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 上需要使其匹配 属性名称,因为它返回列 全部大写的名称(例如 “学生姓名”)。这也可能是 用一个定制的变压器解决了 搜索属性名称而不是 使用完全匹配——也许我们应该 提供一个fuzzyAliasToBean() 方法;)

    参考文献

    【讨论】:

    • 非常感谢帕斯卡一如既往。 :)
    • @PascalThivent 如果我想将课程描述提取到 StudentDTO (StudentDTO.CourseDTO.description) 中的对象中,该怎么做?
    • 这应该在DTO类里面还是单独的类里面?
    • 不推荐使用结果转换器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2019-07-25
    • 2021-02-21
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多