我正在努力转换此 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
关于java - 努力在 JPQL 中转换左连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8836802/