Comment dois-je faire un “profond” fetch rejoindre en JPQL?
Je ne pense pas que je vais jamais comprendre pleinement chercher des jointures.
J'ai une question où je suis tenter d'impatience "gonfler" les références en bas de deux niveaux.
Qui est, à mon A
a une option Collection
de B
s, et chaque B
a 0 ou 1 C
. La taille de la B
collection est connu pour être de petite taille (10 à 20 tops). J'aimerais prefetch ce graphique.
A
's B
relation est marquée comme FetchType.LAZY
et est facultative. B
'relation de C
est également facultative et FetchType.LAZY
.
J'espérais que je pourrais faire:
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
Lorsque je l'exécute, je vois que A
s B
collection est en effet récupéré (je vois un LEFT JOIN
dans le SQL faisant référence à la table à laquelle B
est mappé).
Cependant, je ne vois aucune preuve que C
's de la table est extrait.
Comment puis-je prefetch tous C
s et tous les B
s et tous les C
s qui sont "accessible" à partir d'un A
? Je ne vois aucune façon de le faire.
eclipselink.join-fetch
et eclipselink.batch
conseils...Je vous remercie. Si j'utilise
eclipselink.join-fetch
, on dirait que je suis autorisé à mettre un seul attribut. Est-ce exact? Par exemple, si je souffle mon join-fetch
capital sur a.bs.c
, puis, si je voulais aussi join fetch—dire—a.bs.d
je serais hors de la chance. Droit?Oh, c'est intéressant. Le EclipseLink documentation (wiki.eclipse.org/EclipseLink/UserGuide/JPA/...) ne dit pas que la double indicateur de requête touches sont possibles, mais ils sont peut-être? Voir ce lien intéressant: github.com/mysema/querydsl/issues/348
Je peux confirmer que plusieurs
eclipselink.join-fetch
conseils de faire le travail. Nous l'utilisons beaucoup au travail et les instructions SQL générées sont corrects.Merci. Avez-vous une expérience avec ce bug: bugs.eclipse.org/bugs/show_bug.cgi?id=408719?
OriginalL'auteur Laird Nelson | 2013-05-21
Vous devez vous connecter pour publier un commentaire.
La JPA spec ne permet pas d'aliasing une extraction de la rejoindre, mais certains JPA fournisseurs.
EclipseLink n'est que de 2,4. EclipseLink également permettre imbriquée join fetch à l'aide de la notation par points (c'est à dire "JOIN FETCH un.bs.c"), et prend en charge un indicateur de requête "eclipselink.rejoignez-fetch" qui permet imbriqués les jointures (vous pouvez spécifier plusieurs conseils du même nom d'indicateur).
En général, vous devez être prudent lors de l'utilisation d'un alias sur une extraction de la rejoindre, que vous pouvez affecter les données renvoyées.
Voir,
http://java-persistence-performance.blogspot.com/2012/04/objects-vs-data-and-filtering-join.html
eclipselink.rejoignez-fetch est aussi dans l'eclipseLink 2.3: .setHint("eclipselink.rejoignez-fetch", "un.bs.c")
OriginalL'auteur James
Source: http://www.coderanch.com/t/570828/ORM/databases/Recursive-fetch-join-recursively-fetching
OriginalL'auteur Dherik
Je suis de l'utilisation d'Hibernate (et cela peut être précis) et j'ai eu du succès avec cette:
(Note de l'
b
dans la liste de sélection).C'était le seul moyen que j'ai trouvé cela fonctionnerait pour moi, notez que cela renvoie
Object[]
pour moi, et je puis filtrer dans le code comme ceci:OriginalL'auteur twihoX