java - 努力在 JPQL 中转换左连接查询

标签 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,它不会返回正确的数据

最佳答案

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

相关文章:

java - 如何使用 HttpServletRequest(Spring Framework) 传递同名的多个值?

c# - 如何使用 Inner Join 进行更新

java - JPA hibernate内部执行多选择查询

java - 了解 Java 中可变参数的意外行为

java - 如何在不将对象作为字段包含在内的情况下使项目中的所有类都可以使用该对象?

MySQL:无法添加或更新子行:引用 UID 时外键约束失败

java - 使用Gradle时抽象模式类型未知

java - 使用 JPA 检索多个对象

java - 在 Spring JPA 中保存对象之前触发

mysql - 显示每个答案计数的用户 ID 计数