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?
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. –
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. –
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? –