Wie mache ich ein "tief" fetch Joins in JPQL?
Ich glaube nicht, dass ich jemals vollständig zu verstehen, fetch-joins.
Ich habe eine Abfrage, wo ich bin versucht zu eifrig "aufblasen" bezieht sich auf zwei Ebenen.
Ist, meine A
hat eine optionale Collection
von B
s, und jeder B
hat entweder 0 oder 1 C
. Die Größe der B
Sammlung bekannt ist, klein zu sein (10-20 tops). Ich möchte prefetch dieses Diagramm.
A
's B
Beziehung gekennzeichnet ist, als FetchType.LAZY
und ist optional. B
's Beziehung zu C
ist ebenfalls optional und FetchType.LAZY
.
Ich hatte gehofft, ich könnte tun:
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
Wenn ich diese ausführe, sehe ich, dass A
s B
Sammlung ist in der Tat geholt (ich sehe ein LEFT JOIN
im SQL referenzieren der Tabelle, um die B
zugeordnet ist).
Allerdings sehe ich keine solchen Beweise, dass C
's Tisch geholt.
Wie kann ich die prefetch-alle C
s und alle B
s und alle C
s, die "erreichbar", die aus einer bestimmten A
? Ich sehe keinen Weg, dies zu tun.
- Was JPA-provider verwenden Sie? Es gibt Hinweise in EclipseLink genau für diese Art von Funktionalität. Check-out
eclipselink.join-fetch
undeclipselink.batch
Hinweise... - Danke. Wenn ich
eclipselink.join-fetch
, wie es aussieht bin ich erlaubt, nur ein einziges Attribut gesetzt. Ist das richtig? Zum Beispiel, wenn ich Schlag meinejoin-fetch
Hauptstadt aufa.bs.c
, wenn dann wollte ich auch join-fetch—sagen—a.bs.d
würde ich wieder Glück. Richtig? - Oh, das ist interessant. Die EclipseLink Dokumentation (wiki.eclipse.org/EclipseLink/UserGuide/JPA/...) nicht sagen, dass die doppelte Abfrage-Tipp-Tasten möglich sind, aber vielleicht sind Sie? Siehe diesen interessanten link: github.com/mysema/querydsl/issues/348
- Ich kann überprüfen, dass mehrere
eclipselink.join-fetch
Hinweise für die Arbeit. Wir verwenden es schwer bei der Arbeit und die generierten SQL-Anweisungen korrekt sind. - Danke. Haben Sie Erfahrungen mit diesem Fehler: bugs.eclipse.org/bugs/show_bug.cgi?id=408719?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der JPA-Spezifikation nicht erlaubt aliasing ein fetch-join, aber einige PPV-Anbieter.
EclipseLink als der 2.4. EclipseLink auch zulassen, dass verschachtelte join-fetch mit der dot-notation (z.B. "JOIN FETCH ein.bs.c"), und unterstützt eine Abfragehinweis "eclipselink.join-fetch" ermöglicht verschachtelte joins (Sie können mehrere Tipps mit dem gleichen Hinweis-name).
Im Allgemeinen müssen Sie vorsichtig sein, wenn über einen alias auf ein fetch-join, wie können Sie Einfluss auf die Daten, die zurückgegeben wird.
Sehen,
http://java-persistence-performance.blogspot.com/2012/04/objects-vs-data-and-filtering-join.html
Quelle: http://www.coderanch.com/t/570828/ORM/databases/Recursive-fetch-join-recursively-fetching
Bin ich mit Hibernate (und dies kann spezifisch sein) und ich habe Erfolg mit dieser:
(Hinweis: die
b
in der select-Liste).War dies die einzige Möglichkeit, die ich gefunden, diese wäre für mich arbeiten, beachten Sie, dass diese zurück
Object[]
für mich und ich habe dann filter es im code etwa so:Nicht genau, JPQL, aber man kann erreichen, dass in reinen JPA mit Kriterien Abfragen:
Unterstützung für diese Art von verschachtelten Holen ist Hersteller-spezifische (da JPA nicht von Ihnen verlangen, dies zu tun), aber beide eclipselink und hibernate unterstützen es, und auf diese Weise Ihren code bleibt Anbieter-unabhängig.