说我有5个表,

tblBlogs     tblBlogPosts     tblBlogPostComment    tblUser    tblBlogMember
BlogId        BlogPostsId       BlogPostCommentId   UserId      BlogMemberId
BlogTitle     BlogId            CommentText         FirstName   UserId
              PostTitle         BlogPostsId                     BlogId
                                 BlogMemberId

现在我只想检索那些其blogMember实际上评论的博客和帖子。因此,在短期,我怎么写这个老式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;

正如你所看到的,一切都是内部联接,因此只有针对用户已对一些博客的一些后评论行将被检索。因此,假设他/她加入了3个博客ID分别为1,2,3(其中用户已经加入了博客在tblBlogMembers),但用户只有在博客2(说的BlogPostId = 1)评论道。因此,该行会被检索和1,3-不会因为它是内连接。我怎样写这种类型的查询在 JPQL

在JPQL,我们只能写简单的查询等的发言权:

Select bm.blogId from tblBlogMember Where bm.UserId = objUser;

其中objUser使用提供:

em.find(User.class,1);

因此,一旦我们得到了所有的博客(这里blogId代表博客的对象)的用户加入,我们可以遍历并尽一切花哨的东西。但我不希望落在这个循环的业务,并写这一切的东西在我的Java代码。相反,我要离开,对于数据库引擎做。所以,我怎么写上面的纯SQL为JPQL?什么类型的对象将在JPQL查询回报?因为我只选择从所有的表几场。其中类应该我类型转换该结果?

我想我正确地张贴了我的要求,但是如果我不明白,请让我知道。

更新:根据帕斯卡的回答,我试着写了上面的SQL查询JPQL查询。我面临的一个小问题。该查询工作,但是不完整的:

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

<强>我想修改这对

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

在上面的查询不工作。我怎样才能解决这个问题?

有帮助吗?

解决方案 2

确定,这是最后的回答。花了一个小时,这架一条线。我这一个小时内得到了很多奇怪的错误,但现在我的概念非常清楚:

@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")

其他提示

  

在JPQL,我们只能写简单的查询(...)

这是不正确的,JPQL不支持的 [ LEFT [OUTER] | INNER ] JOIN 。对于内部联接,请参考以下部分的 4.4.5.1内部联接(关系联接)说明书的:

  

4.4.5.1内部联接(关系联接)

     

有内连接的语法   操作

[ INNER ] JOIN join_association_path_expression [AS] identification_variable
     

例如,下面的查询联接   在之间的关系   客户和订单。这类   加入通常等同于加入了   在一个外键关系   数据库。

SELECT c FROM Customer c JOIN c.orders o WHERE c.status = 1
     

关键字INNER可以任选地   使用:

SELECT c FROM Customer c INNER JOIN c.orders o WHERE c.status = 1

您只需要考虑实体之间的关联。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top