Attenzione! Il post non è proprio su Liferay DXP ma riguarda più Hibernate! Però, siccome è un tema che si potrebbe affrontare anche negli sviluppi su Liferay lo censisco qui, sperando che possa tornare utile a qualcuno! ;)
Come ha già spiegato Napo in un post di qualche tempo fa, è possibile (ovviamente) creare custom query su Liferay 7 usando i c.d. Finder.
Oggi però, mentre come al solito ero intento nel non far nulla :), un collega di una Università per la quale abbiamo realizzato un portale mi ha contattato chiedendomi una cosa!
Qui lo stack della chat Telegram dove mi è arrivata la richiesta:
Sandro Zacchino, [31.07.18 13:22]
Ciao Jader, ti faccio una domanda da niubbo
Sandro Zacchino, [31.07.18 13:23]
ho realizzato una custom query in una classe Finder
query.append("SELECT a.*, ea.* ")
.append(" FROM " + DB_PREFIX + "Azienda a ")
.append(" INNER JOIN " + DB_PREFIX + "Evento_Azienda ea ON ")
.append(" ea.aziendaId = a.aziendaId ")
.append(" AND ea.companyId = a.companyId ")
.append(" AND ea.groupId = a.groupId ")
.append(" WHERE 1=1 ")
.append(" AND ea.eventoId = " + String.valueOf(eventoId))
Sandro Zacchino, [31.07.18 13:24]
di seguito aggiungo ad a il suo modelImpl ad ea il suo...tutto funziona e visualizzo i risultati eccetto che per un particolare
Jader Francia, [31.07.18 13:25]
<suspance>
Sandro Zacchino, [31.07.18 13:25]
sia a che ea hanno un campo email il cui contenuto però è diverso. Succede però che ea.getEmail() (l'ho scritto in modo breve giusto per capirci) mi restituisca la mail di a
Occavolo!
Questa è nuova! Ho pensato. Non incollo lo stack di baggianate che gli ho detto di provare :) ma alla fine Sandro ha risolto da solo, elegantemente, il problema!
Leggendo la documentazione di Hibernate, Sandro ha trovato nel paragrafo "16.1.4. Returning multiple entities
" la soluzione al problema!
Basta mettere tra {} gli alias della query e tutto funzionerà!
Cito dalla documentazione di Hibernate:
The following form is not vulnerable to column name duplication:
sess.createSQLQuery("SELECT {cat.*}, {mother.*} FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
.addEntity("cat", Cat.class)
.addEntity("mother", Cat.class)
Grazie mille a Sandro (vero ghost writer di questo post ;)) per aver condiviso la soluzione e avermi permesso di fare un post in più per scalare la classifica e cercare di raggiungere Napo!! :)
A presto e buon divertimento con le query custom, i nomi di colonna duplicati, hibernate e Liferay DXP! :)