题
说我有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
您只需要考虑实体之间的关联。