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

È stato utile?

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.

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