getting result set into DTO with native SQL Query in Hibernate

前端 未结 1 341
旧巷少年郎
旧巷少年郎 2020-12-02 11:16

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

相关标签:
1条回答
  • 2020-12-02 11:48

    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 Reference Guide
      • 16.1.5. Returning non-managed entities
    • Hibernate's Blog
      • Hibernate 3.2: Transformers for HQL and SQL
    0 讨论(0)
提交回复
热议问题