bekommen Ergebnismenge in DTO mit nativen SQL-Abfrage in Hibernate
-
30-09-2019 - |
Frage
Ich habe eine Abfrage wie unter
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
Wenn ich HQL verwenden könnte, würde ich verwendet habe, HQL Konstruktor Syntax direkt bevöl DTO mit der Ergebnismenge. Aber da Hibernate nicht links erlaubt beitreten, ohne einen Verein an Ort und Stelle, die muß ich die Native-SQL-Abfrage verwenden.
Zur Zeit bin ich Looping durch die Ergebnismenge in JDBC-Stil und bevölkern DTO-Objekte. Gibt es einen einfacheren Weg, um es zu erreichen?
Lösung
Sie könnten vielleicht ein Ergebnis Transformator verwenden. Zitiert Hibernate 3.2: Transformatoren für HQL und SQL :
SQL Transformers
Mit nativen SQL-Rückkehr nicht-Einheit Bohnen oder Karte ist oft nützliche statt Grund
Object[]
. Mit Transformatoren, die zur Folge haben jetzt möglich.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);
Tipp: die
addScalar()
Anrufe waren erforderlich auf HSQLDB, um es ein zu machen Match Eigenschaftsname, da es Spalte zurückgibt Namen in Großbuchstaben (z.B. "NAME DES STUDENTEN"). Dies könnte auch sein, mit einem benutzerdefinierten Transformator gelöst, dass suchen Sie die Eigenschaftsnamen statt genaue Übereinstimmung mit - vielleicht sollten wir stellt eine fuzzyAliasToBean () Methode;)
Referenzen
- Hibernate-Referenzhandbuch
- Hibernate Blog