Ich glaube nicht, dass ich Fetch Joins jemals vollständig verstehen werde.Wie mache ich einen "tiefen" Abruf Join in JPQL?
Ich habe eine Abfrage, wo ich eifrig versuche, Referenzen auf zwei Ebenen "aufzublasen".
Das heißt, mein A
verfügt über eine optionale Collection
von B
s, und jeder B
hat entweder 0 oder 1 C
. Die Größe der B
Kollektion ist bekanntlich klein (10-20 Tops). Ich möchte dieses Diagramm vorab abrufen.
A
's B
Beziehung ist als FetchType.LAZY
markiert und ist optional. B
's Beziehung zu C
ist auch optional und FetchType.LAZY
.
Ich hatte gehofft, was ich tun konnte:
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
Als ich das laufen, ich sehe, dass A
s B
Sammlung tatsächlich abgerufen wird (Ich sehe einen LEFT JOIN
in der SQL-Verweisen auf die Tabelle, auf die B
abgebildet) .
Allerdings sehe ich keinen solchen Beweis, dass die Tabelle C
abgerufen wird.
Wie kann ich Prefetch alle C
s und alle B
s und alle C
s, die „erreichbar“ von einem gegebenen A
sind? Ich sehe keinen Weg, dies zu tun.
Welche JPA-Provider verwenden Sie? Es gibt Hinweise in EclipseLink genau für diese Art von Funktionalität. Check out 'eclipselink.join-fetch' und' eclipselink.batch' Hinweise ... – Cascader
Vielen Dank. Wenn ich 'eclipselink.join-fetch' verwende, scheint es mir erlaubt zu sein, nur ein Attribut zu setzen. Ist das korrekt? Zum Beispiel, wenn ich mein 'join-fetch'-Kapital auf' a.bs.c' blase, dann wäre ich kein Glück, wenn ich auch fetch-say-'a.bs.d' beitreten wollte. Recht? –
Oh, das ist interessant. Die EclipseLink-Dokumentation (http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Query_Hints#Join_Fetch) sagt nicht, dass doppelte Abfragehinweisschlüssel möglich sind, aber vielleicht sind sie? Sehen Sie diesen interessanten Link: https://github.com/mysema/querydsl/issues/348 –