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! :)