ottenendo set di risultati in DTO con nativo query SQL in Hibernate
-
30-09-2019 - |
Domanda
Ho una domanda come qui di seguito
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
Se potessi usare HQL, avrei usato HQL costruttore sintassi per DTO direttamente popolano con il set di risultati. Ma, dal momento che di ibernazione non permette sinistra unirsi senza avere un'associazione in atto devo usare il nativo di query SQL.
Attualmente sto scorrendo il set di risultati in stile JDBC e popolando oggetti DTO. C'è un modo più semplice per raggiungerlo?
Soluzione
Si potrebbe forse usare un trasformatore risultato. Citando Hibernate 3.2: Trasformatori per HQL e SQL :
SQL Transformers
Con SQL nativo di ritorno non-entità fagioli o Map è spesso più utile invece di
Object[]
base. Con comportare trasformatori che ora possibile.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);
Suggerimento: le chiamate
addScalar()
erano richiesto sul HSQLDB per farlo corrispondere una nome della proprietà in quanto restituisce colonna nomi in tutto maiuscolo (es "NOME DELLO STUDENTE"). Questo potrebbe anche essere risolto con un trasformatore personalizzato cercare i nomi delle proprietà invece di utilizzando corrispondenza esatta - forse è il caso fornire un metodo fuzzyAliasToBean ();)
Bibliografia
- Guida di riferimento Hibernate
- Il blog di Hibernate