我正在努力转换这个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,则它不会返回正确的数据
答案 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.1草案的一部分。
EclipseLink 2.4里程碑版本已经提供ON支持,
http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#ON