9
votes

JPA Pays Fetch Entités sur plusieurs niveaux avec API de critères

J'utilise JPA2 avec ses critères API pour sélectionner mes entités dans la base de données. La mise en œuvre est OpenJPA sur WebSphere Application Server. Toutes mes entités sont modélisées avec FetchType = paresseux.

Je sélectionne une entité avec certains critères de la base de données et souhaitez charger toutes les données imbriquées des sous-tables à la fois. Si j'ai un Datamodel où le tableau A est rejoint OneTomanan to Table B, je peux utiliser une clause de fetch dans ma requête de critère: xxx

Ceci fonctionne bien. Je reçois un élément A et tous ses éléments de B sont remplis correctement. Maintenant, le tableau B a une relation oneomanan-relation avec le tableau C et je veux les charger aussi. Donc, j'ajouterai la déclaration suivante à ma requête: xxx

mais cela ne fera rien.

Est-ce que quelqu'un sait que quiconque sait comment chercher des entités multiples dans une requête ?


0 commentaires

3 Réponses :


10
votes

Il ne fonctionne pas avec JPQL et il n'ya aucun moyen de le faire fonctionner dans des critères de critères non plus. Les spécifications limitent les entités extraites sur celles qui sont référencées directement à partir de l'entité renvoyée:

À propos de Fetch Joignez-vous à CritèreQuery:

Une association ou un attribut référencé par la méthode de récupération doit être référencé d'une entité ou intégrable qui est renvoyé comme résultat de la requête.

À propos de Fetch Joignez-vous à JPQL:

L'association référencée par le côté droit de la clause de jointure de récupération doit être une association ou une collection ELEMENT qui est référencée de une entité ou incorporable qui est renvoyé à la suite de la requête.

La même limitation est également racontée dans la documentation OpenJPA.


3 commentaires

Merci beaucoup pour votre réponse. Mais il y a un exemple de JPQL dans l'article de documentation que vous avez pointé: Sélectionnez X dans le magazine x Joindre Fetch X.Articles un joindre Fetch A.Publishers p Où x.title = 'JDJ' Il y a des tables x , A et P avec des relations X-> A et A-> p. C'est exactement ce que je veux faire avec l'API de critères.


Vous ne l'avez pas lu très attentivement. C'est exemple sur la requête qui provoque une erreur de syntaxe. Phrase avant cette requête est la suivante: "La requête suivante aboutira à une erreur de syntaxe:". Ce que vous voulez faire ne fonctionne pas.


Oh, tu as raison. Donc, je peux seulement dire: Ooops. Mais de toute façon ... Y a-t-il une pratique que je peux résoudre un tel problème? Je pense qu'il y a beaucoup de gens dans ce monde qui veulent aller chercher plus de deux tables. Dois-je rejoindre la deuxième table ou dois-je lire les autres données manuellement? Quelle est la meilleure pratique pour cela?



-2
votes

Vous pouvez concevoir une vue dans les tables de jonction DB B et C, créer l'entité et le fetchit installé de l'entité d'origine.


1 commentaires

Ce n'est pas une réponse plus précisément, il n'est pas répondu à la question



1
votes

Pour ce qui vaut. Je fais tout le temps et ça marche très bien. Plusieurs points:

J'utilise JPA 2.1, mais je suis presque sûr de travailler à JPA 2.0 aussi.

J'utilise l'API de critère, et je sais que certaines choses fonctionnent différent dans jpql. Alors ne pensez pas que cela fonctionne d'une manière ou d'une autre fonctionne, car c'est ce qui se passe dans JPQL. Le plus souvent, ils se comportent de la même manière, mais pas toujours. (Aussi, j'utilise des critères simples API, pas de querydsl ou quoi que ce soit. Parfois, cela fait une différence)

Mes associations ont tendance à être singular_attribute. Alors peut-être que c'est le problème ici. Essayez un test avec les jointures en marche arrière "C.Fetch (B) .fetch (a)" et voir si cela fonctionne. Je sais que ce n'est pas la même chose, mais juste pour voir si cela vous donne un indice. Je suis presque sûr que je l'ai fait avec OneTomananness Fetch, cependant.

Yep. Je viens de vérifier et trouvé: root.fetch ("cibles", gauche) .fetch ("Destinations", gauche) .fetch ("interne", à gauche) Cela a travaillé sans problèmes pendant des mois, peut-être plus d'un an. Je viens d'exécuter un test et il génère cette requête: xxx

et renvoie toutes les lignes avec toutes les associations avec tous les champs.

Peut-être que le problème est différent chose. Vous venez de dire «ça ne fera pas de quelque chose». Je ne sais pas si cela jette une exception ou quoi, mais peut-être qu'il exécute la requête correctement mais ne renvoie pas les rangées que vous attendez à cause de certaines conditions ou de quelque chose comme ça.


0 commentaires