假设我有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查询将返回什么类型的对象?因为我只从所有表中选择了几个字段。在哪个类中应该对结果进行类型转换?
如果我没有表达清楚,请告诉我。
更新:根据Pascal的答案,我尝试编写上述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
上述查询不起作用。我该如何解决这个问题?
SELECT productCode, productName, textDescription FROM products INNER JOIN productlines USING (productline);
- PAA