2017-04-12 81 views
1

我想所有Branch的列表,即使他們有沒有賬戶user作用JPQL LEFT JOIN不工作

Query query = em.createQuery("SELECT NEW com.package.BranchInstructors(b,a) FROM Branch b LEFT JOIN b.accounts a WHERE b.dFlg = 0 AND a.userRole = :role ORDER BY b.name ASC"); 
query.setParameter("role", "user"); 
return query.getResultList(); 

不幸的是它僅返回分行與user作用,它就像做INNER JOIN代替。

任何想法是怎麼回事?

回答

0

只需添加a.userRole是空的條件來查詢,以避免過濾從左側得到空的UserRole加入

SELECT NEW com.package.BranchInstructors(b,a) 
    FROM Branch b 
    LEFT JOIN b.accounts a 
    WHERE b.dFlg = 0 
    AND (a.userRole = :role OR a.userRole IS NULL) 
    ORDER BY b.name ASC" 
0

問題出在您的WHERELEFT JOIN條款。

如果使用LEFT JOINAccounts並在WHEREAND條件使用該表,它像一個JOIN

所以,你可以使用WITHLEFT JOIN

Query query = em.createQuery("SELECT NEW com.package.BranchInstructors(b,a) FROM Branch b 
LEFT JOIN b.accounts a WITH a.userRole = :role 
WHERE b.dFlg = 0 ORDER BY b.name ASC"); 
+0

它有使用'WITH'時出錯語法錯誤解析查詢[SELECT NEW com.package.BranchInstructors(b,a)FROM分支b LEFT JOIN b.accounts WITH WITH a.userRole =:role WHERE b.dFlg = 0 ORDER BY b .name ASC],第1行,第93列:意外標記[WITH]' –

+0

您使用的JPA實現是什麼版本?嘗試使用'ON'而不是'WITH'。 – Dherik

+0

我不確定什麼版本,我使用GlassFish 3.1.2的JSF 2.1,但這是詳細的錯誤'異常[EclipseLink-8025](Eclipse持久性服務 - 2.3.2.v20111125-r10461):org.eclipse .persistence.exceptions.JPQLException 異常說明:解析查詢的語法錯誤[SELECT NEW com.package.BranchInstructors(b,a)FROM分支b LEFT JOIN b.accounts a ON a.userRole =:role WHERE b.dFlg = 0 ORDER BY b.name ASC],第1行,第93列:意外標記[ON]。內部異常:NoViableAltException(80 @ [()*回送477:9:(node = join)*])'我剛剛接管了這個項目 –