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?

InformationsquelleAutor TCM | 2010-05-16