EclipseLink JPQL (Glassfish v3): aderire a prendere problema di sintassi?
-
22-09-2019 - |
Domanda
Con Hibernate io sono abituato a fare qualcosa di simile al seguente:
select n from NetworkElement n join fetch n.site s where s.active is true
Tuttavia, EclipseLink lamenta molto su questo:
Caused by: Exception [EclipseLink-8024] (Eclipse Persistence Services - 2.0.0.v20091127-r5931): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing the query [select n from NetworkElement n join fetch n.site s], line 1, column 49: syntax error at [s].
(L'interrogare della pila è diverso da quello sopra, ma il risultato è lo stesso)
ho provato diverse combinazioni, nessuna delle quali ha lavorato:
select n from NetworkElement n join fetch n.site where n.site.active is true
select n from NetworkElement n join fetch n.site as site where site.active is true
Ho provato anche il passaggio a un soggetto diverso nel mio modello di dominio, sospettando che forse la mia mappatura non è corretta. Ancora, lo stesso problema.
E 'possibile che io posso solo raggiungere questo utilizzando un hint per la query? Io non voglio farlo.
A proposito, sto usando EcliseLink come spedito con Netbeans 6.8 e Glassfish v3.
Apprezzerei tutto l'aiuto!
Rodrigo
Soluzione
Il problema principale è che la sintassi JPQL non consente aliasing fetch unisce ed è per questo EclipseLink utilizza i suggerimenti di query per questa funzionalità. C'è una richiesta di miglioramento per aggiungere aliasing unirsi recupera direttamente nel JPQL e se volete vederlo completato si prega di votare per esso. ( https://bugs.eclipse.org/bugs/show_bug.cgi?id = 293.775 ).
- Gordon Yorke
Altri suggerimenti
Bene, sembra che uno non è permesso di trasformare un operazione di recupero si uniscono in JPQL, anzi .. Funziona con Hibernate perché supporta aliasing attraverso HQL, e si sono autorizzati a rilasciare HQL a un oggetto JPA Query.
Quindi, non avevo altra scelta che passare a query denominate con sentori di query. Non mi piace molto dichiarando query con annotazioni a causa della elevata prolissità sulle classi di entità, così ho aggiunto un file jar orm.xml alla dell'unità di persistenza, e ha fatto il seguente:
<!-- Fetch network elements -->
<named-query name="fetchNetworkElements">
<query>select n from NetworkElement n</query>
<lock-mode>NONE</lock-mode>
<hint name="eclipselink.join-fetch" value="n.site" />
<hint name="eclipselink.join-fetch" value="n.site.area" />
</named-query>
Spero che questo dà qualche indizio per chiunque alle prese con le stesse carenze della JPQL prima.