Nie sądzę, że kiedykolwiek w pełni zrozumiem pobieranie sprzężeń.Jak wykonać "głębokie" sprzężenie pobierania w JPQL?
Mam kwerendę, w której próbuję z niecierpliwością "napompować" referencje na dwóch poziomach.
Oznacza to, że mój A
ma opcjonalnej Collection
z B
s, a każdy B
ma wartość 0 lub 1 C
. Wielkość kolekcji B
jest znana jako mała (10-20 wierzchołków). Chciałbym wstępnie pobrać ten wykres. Powiązanie
A
jest oznaczone jako FetchType.LAZY
i jest opcjonalne. Związek B
z C
jest również opcjonalny i FetchType.LAZY
.
Miałem nadzieję, mógłby zrobić:
SELECT a
FROM A a
LEFT JOIN FETCH a.bs // look, no alias; JPQL forbids it
LEFT JOIN a.bs b // "repeated" join necessary since you can't alias fetch joins
LEFT JOIN FETCH b.c // this doesn't seem to do anything
WHERE a.id = :id
Kiedy uruchamiam to, widzę, że A
s B
kolekcja jest rzeczywiście naciągane (widzę LEFT JOIN
w SQL odwołuje się do stołu, do którego B
jest odwzorowany) .
Nie widzę jednak takich dowodów na to, że tabela jest pobierana C
.
Jak mogę wstępne pobieranie wszystkie C
S i wszystkie B
S i wszystkie C
s, które są „osiągalny” z danego A
? Nie widzę żadnego sposobu, aby to zrobić.
Co dostawca JPA używacie? W EclipseLink dostępne są wskazówki dotyczące tego rodzaju funkcji. Zapoznaj się z podpowiedziami 'eclipselink.join-fetch' i' eclipselink.batch' ... – Cascader
Dziękuję. Jeśli używam 'eclipselink.join-fetch', wygląda na to, że mogę ustawić tylko jeden atrybut. Czy to jest poprawne? Na przykład, jeśli zdmuchnę moją stolicę 'join-fetch' na' a.bs.c', to gdybym również chciał dołączyć do fetch-say-'a.bs.d, nie miałbym szczęścia. Dobrze? –
To jest interesujące. Dokumentacja EclipseLink (http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Query_Hints#Join_Fetch) nie mówi, że duplikaty kluczy podpowiedzi do zapytania są możliwe, ale być może są? Zobacz ten interesujący link: https://github.com/mysema/querydsl/issues/348 –