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