Comment puis-je écrire cette requête JPQL?
Question
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 messages pour lesquels blogMember a fait de commentaires. Donc en bref, comment puis-je écrire ce bon 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 INNER JOIN, de sorte que cette ligne sera récupérée pour laquelle l'utilisateur a commenté sur certains post de certains blog. Alors, on suppose qu'il / elle a rejoint 3 blogs dont ids sont 1,2,3 (Les blogs qui a rejoint l'utilisateur sont tblBlogMembers) mais l'utilisateur n'a commenté dans le blog 2 (par exemple BlogPostId = 1). Donc, cette ligne sera récupéré et 1,3 ne sera pas comme il est INNER JOIN. Comment puis-je écrire ce genre de requête dans JPQL ?
Dans JPQL, on ne peut écrire des requêtes simples comme par exemple:
Select bm.blogId from tblBlogMember Where bm.UserId = objUser;
Où objUser est fournie à l'aide:
em.find(User.class,1);
Ainsi, une fois que nous obtenons tous les blogs (ici blogid représente un objet de blog) quel utilisateur a rejoint, nous pouvons boucle à travers et de faire toutes les choses de fantaisie. Mais je ne veux pas tomber dans cette affaire en boucle et écrire toutes ces choses dans mon code Java. Je veux plutôt laisser cela pour le moteur de base de données pour faire. Alors, comment puis-je écrire ci-dessus SQL ordinaire dans JPQL? Et quel type d'objet sera le retour de la requête JPQL? Parce que je ne fais que choisissais quelques champs de toutes les tables. Dans quelle classe dois-je typecast le résultat?
Je pense que je correctement mon exigence posté, si je ne suis pas certain s'il vous plaît laissez-moi savoir.
Mise à jour: Selon la réponse de pascals, j'ai essayé d'écrire requête JPQL pour la requête SQL ci-dessus. Je suis face à un petit problème. Cette requête fonctionne, mais est incomplète:
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 modifier ceci:
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?
La solution 2
Ok, ceci est la réponse finale. Il a fallu une heure pour encadrer cette une ligne. J'ai eu beaucoup d'erreurs étranges pendant cette heure, mais maintenant mes concepts sont assez clairs:
@NamedQuery(name = "BlogMembers.findBlogsOnWhichCommentsAreMade",
query = "SELECT bm.blogId FROM BlogMembers bm INNER JOIN bm.blogId b
INNER JOIN b.blogPostsList bp INNER JOIN bp.blogPostCommentList bpc
INNER JOIN bpc.blogMembersId bmt WHERE bm.userId = :userId")
Autres conseils
Dans JPQL, on ne peut écrire des requêtes simples (...)
Ce n'est pas vrai et JPQL pris en charge par [ LEFT [OUTER] | INNER ] JOIN
. Pour les jointures internes, reportez-vous à la section 4.4.5.1 Les jointures internes (relation se joint) de la spécification:
4.4.5.1 Les jointures internes (relation se joint)
La syntaxe de la jointure opération est
[ INNER ] JOIN join_association_path_expression [AS] identification_variable
Par exemple, la requête joint ci-dessous sur la relation entre les clients et les commandes. Ce type de rejoindre égalise généralement à une jointure sur une relation de clé étrangère dans la base de données.
SELECT c FROM Customer c JOIN c.orders o WHERE c.status = 1
Le mot-clé INNER peut éventuellement être utilisé:
SELECT c FROM Customer c INNER JOIN c.orders o WHERE c.status = 1
Vous avez juste besoin de penser association entre les entités.