2012-01-09 11 views
7

Sto usando JPA2 con la sua API Criteria per selezionare le mie entità dal database. L'implementazione è OpenJPA su WebSphere Application Server. Tutte le mie entità sono modellate con Fetchtype = Lazy.jpa lazy fetch entità su più livelli con criteri api

Seleziono un'entità con alcuni criteri dal database e desidero caricare tutti i dati annidati dalle tabelle secondarie contemporaneamente. Se ho un datamodel in cui la tabella A è unita OneToMany a tabella B, posso usare un Fetch-clausola mia domanda criteri:

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<A> cq = cb.createQuery(A.class); 
Root<A> root = cq.from(A.class); 
Fetch<A,B> fetch = root.fetch(A_.elementsOfB, JoinType.LEFT); 

Questo funziona bene. Ottengo un elemento A e tutti i suoi elementi di B sono riempiti correttamente. Ora la tabella B ha una relazione OneMany con la tabella C e voglio caricarli anch'essi. Quindi aggiungo la seguente dichiarazione alla mia domanda:

Fetch<B,C> fetch2 = fetch.fetch(B_.elementsOfC, JoinType.LEFT); 

Ma questo non farò nulla.

Qualcuno sa come recuperare entità multi livello in una query?

risposta

10

Non funziona con JPQL e non c'è modo di farlo funzionare anche in CriteriaQueries. I limiti di specifica recuperati entità a quelli in cui si fa riferimento direttamente dall'entità restituita:

circa un download unirsi con CriteriaQuery:

An association or attribute referenced by the fetch method must be referenced from an entity or embeddable that is returned as the result of the query.

circa un download unirsi JPQL:

The association referenced by the right side of the FETCH JOIN clause must be an association or ele ment collection that is referenced from an entity or embeddable that is returned as a result of the query.

stessa limitazione è anche detto nella documentazione di OpenJPA.

+0

Grazie mille per la risposta. Ma c'è un esempio di JPQL nell'articolo della documentazione che hai indicato: 'SELECT x FROM Magazine x join fetch x.articles un join recupera a.publishers p WHERE x.title = 'JDJ'' Ci sono tabelle x, un e p con le relazioni x-> ae a-> p. Questo è esattamente ciò che voglio fare con l'API dei criteri. –

+0

Non l'hai letto molto attentamente. È un esempio di query che causa l'errore di sintassi. Frase prima di quella query: "La seguente query genererà un errore di sintassi:". Quello che vuoi fare non funziona. –

+3

Oh, hai ragione. Quindi posso solo dire: Ooops. Ma comunque ... C'è qualche pratica per risolvere un problema del genere? Penso che ci siano molte persone in questo mondo che vogliono recuperare più di due tavoli. Devo prima unirmi al secondo tavolo o leggere manualmente gli altri dati? Qual è la migliore pratica per questo? –

Problemi correlati