2017-04-12 96 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)*])'我刚刚接管了这个项目 –