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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top