繁体   English   中英

努力在JPQL中转换左联接查询

[英]Struggling to convert a left join query in JPQL

我正在努力转换此sql查询

SELECT feature.*, rolefeature.roleId, rolefeature.permission 
    FROM feature 
        Left JOIN rolefeature 
            ON feature.featureId = roleFeature.featureId 
                and roleFeature.roleId = ?

效果很好。

到JPQL。 我有这个

select f, rf.role.roleId as roleId, rf.permission 
    from Feature f 
        LEFT JOIN f.roleFeatures rf 
            and rf.role.roleId = :roleId

但似乎抱怨AND关键字。 我有点茫然。 如果我使用WHERE代替AND,则不会返回正确的数据

首先, and子句在这里毫无意义。 您需要一个where子句。

其次,对rf.role查询隐式地在RoleFeature和Role之间建立内部联接。 您可以通过检查生成的SQL来查看它。 您需要做第二次左联接才能访问角色。

第三,如果在where子句中对角色ID进行了限制,则左联接将成为内部联接。 因此,您需要与JPQL中的on子句等效。 我不认为JPQL有它,但是Hibernate使用with关键字支持它:

select f, role.roleId as roleId, rf.permission 
from Feature f 
left join f.roleFeatures rf 
left join rf.role role with role.roleId = :roleId

也许你可以用

left join rf.role role
where role.roleId is null or role.roleId = :roleId

JPA 2.0 JPQL不支持ON,但它是JPA 2.1草案的一部分。

EclipseLink 2.4里程碑版本已经提供了ON支持,

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#ON

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM