Comment puis-je écrire cette requête JPQL?
Dire que j'ai 5 tables,
tblBlogs tblBlogPosts tblBlogPostComment tblUser tblBlogMember
BlogId BlogPostsId BlogPostCommentId UserId BlogMemberId
BlogTitle BlogId CommentText FirstName UserId
PostTitle BlogPostsId BlogId
BlogMemberId
Maintenant je veux récupérer uniquement les blogs et les postes pour lesquels blogMember a effectivement fait remarquer. Donc, en bref, comment puis-je écrire cette plaine vieux SQL?
SELECT b.BlogTitle, bp.PostTitle, bpc.CommentText FROM tblBlogs b
INNER JOIN tblBlogPosts bp on b.BlogId = bp.BlogId
INNER JOIN tblBlogPostComment bpc on bp.BlogPostsId = bpc.BlogPostsId
INNER JOIN tblBlogMember bm ON bpc.BlogMemberId = bm.BlogMemberId
WHERE bm.UserId = 1;
Comme vous pouvez le voir, tout est une jointure Interne, donc seulement que la ligne sera récupéré pour laquelle l'utilisateur a commenté sur certains post de certains blog. Donc, supposons qu'il/elle a rejoint les 3 blogs dont les id sont 1,2,3 (Les blogs de l'utilisateur qui a rejoint sont en tblBlogMembers), mais l'utilisateur a seulement commenté en blog 2 (de dire BlogPostId = 1). De sorte que la ligne sera récupéré et 1,3 ne comme il est Inner Join. Comment puis-je écrire ce genre de requête dans JPQL?
En JPQL, on ne peut qu'écrire des requêtes simples, comme le disent:
Select bm.blogId from tblBlogMember Where bm.UserId = objUser;
Où objUser est fournie à l'aide:
em.find(User.class,1);
Donc une fois que nous obtenons tous les blogs (ici blogId représente un blog d'objet) de l'utilisateur qui a rejoint, nous pouvons mettre en boucle et faire toutes les choses de fantaisie. Mais je ne veux pas tomber dans cette boucle d'affaires et d'écrire toutes ces choses dans mon code Java. Au lieu de cela, je veux quitter que pour le moteur de base de données à faire. Alors, comment puis-je écrire au-dessus de la plaine SQL en JPQL? Et quel est le type de l'objet de la requête JPQL retour? Parce que je suis de ne sélectionner que quelques champs de toutes les tables. Dans quelle catégorie dois-je transtypage le résultat?
Je pense que j'ai posté ma demande correctement, si je ne suis pas clair s'il vous plaît laissez-moi savoir.
Mise à JOUR : Comme par pascal réponse, j'ai essayé d'écrire une requête JPQL pour le dessus de requête SQL. Je suis confronté à un petit problème. Cette requête fonctionne, mais est incomplet:
SELECT bm.blogId FROM BlogMembers bm
INNER JOIN bm.blogId b
INNER JOIN b.blogPostsList bp
INNER JOIN bp.blogPostCommentList bpc
WHERE bm.userId = :userId
Je veux le modifier pour:
SELECT bm.blogId FROM BlogMembers bm
INNER JOIN bm.blogId b
INNER JOIN b.blogPostsList bp
INNER JOIN bp.blogPostCommentList bpc
WHERE bpc.blogMembersId = bm.blogMembersId AND bm.userId = :userId
La requête ci-dessus ne fonctionne pas. Comment puis-je résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas vrai et JPQL prend en charge
[ LEFT [OUTER] | INNER ] JOIN
. Pour les Jointures internes, reportez-vous à la section 4.4.5.1 Jointures internes (Rapport Joint) du cahier des charges:Vous avez juste besoin de penser à l'association entre les entités.
Ok, c'est de la réponse finale. Il a fallu une heure de cadre à une seule ligne. J'ai eu de nombreuses erreurs étranges au cours de cette heure, mais maintenant mes concepts sont assez claires: