苦苦挣扎在JPQL中转换左连接查询

时间:2012-01-12 14:36:58

标签: java sql jpa persistence 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,则它不会返回正确的数据

2 个答案:

答案 0 :(得分:1)

首先,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

答案 1 :(得分:0)

JPA 2.0 JPQL不支持

,但它是JPA 2.1草案的一部分。

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

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