2012-01-09 9 views
7

Używam JPA2 z jego API Criteria do wybierania moich obiektów z bazy danych. Implementacją jest OpenJPA na serwerze WebSphere Application Server. Wszystkie moje jednostki są modelowane za pomocą Fetchtype = Lazy.jpa leniwy pobiera obiekty na wielu poziomach z kryteriami api

Wybieram encję z pewnymi kryteriami z bazy danych i chcę jednocześnie załadować wszystkie zagnieżdżone dane z pod tabel. Jeśli mam datamodel gdzie tabela A jest połączona oneToMany do tabeli B, mogę używać Fetch-klauzuli w moim kryteria zapytania:

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); 

To działa prawidłowo. Dostaję element A i wszystkie jego elementy B są wypełnione poprawnie. Teraz tabela B ma relację jednoosobową do tabeli C i chcę ją również załadować. Więc dodać następujące oświadczenie do mojego zapytania:

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

Ale to przyzwyczajenie nic robić.

Czy ktoś wie, jak pobrać jednostki wielopoziomowe w jednym zapytaniu?

Odpowiedz

10

Nie działa z JPQL i nie ma sposobu na jego działanie w CriteriaQueries. Granice specyfikacji pobrane podmioty do tych, w których odwołuje się bezpośrednio ze zwróconego jednostki:

O sprowadzić przyłączyć 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.

O sprowadzić przyłączyć 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.

samo ograniczenie jest również w dokumentacji OpenJPA.

+0

Dziękuję bardzo za odpowiedź. Ale istnieje przykład JPQL w dokumencie, który wskazałeś: 'SELECT x FROM Magazine x join pobierz x.artykuły a join pobierz a.publishers p WHERE x.title = 'JDJ'' Istnieją tabele x, a i p przy relacjach x-> a i a-> p. Właśnie to chcę zrobić z API API. –

+0

Nie przeczytałeś tego bardzo uważnie. Jest to przykład zapytania, który powoduje błąd składni. Zdanie poprzedzające to zapytanie: "Następujące zapytanie spowoduje błąd składni:". To, co chcesz zrobić, nie działa. –

+3

Och, masz rację. Mogę tylko powiedzieć: Ooops. Ale w każdym razie ... Czy istnieje jakaś praktyka, w której mogę rozwiązać taki problem? Myślę, że na tym świecie jest wielu ludzi, którzy chcą przynieść więcej niż dwie tabele. Czy muszę najpierw dołączyć do drugiej tabeli, czy też ręcznie odczytać pozostałe dane? Jaka jest najlepsza praktyka? –

Powiązane problemy