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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top