簡體   English   中英

我該如何編寫這個JPQL查詢?

[英]How do I write this JPQL query?

說我有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

以上查詢無效。 我怎么解決這個問題?

在JPQL中,我們只能編寫簡單的查詢(...)

這不是真的,JPQL確實支持[ LEFT [OUTER] | INNER ] JOIN [ 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 

您只需要考慮實體之間的關聯。

好的,這是最終的答案。 花了一個小時來構建這一行。 在這一小時里我遇到了許多奇怪的錯誤,但現在我的概念已經足夠清楚了:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM