2012-01-12 26 views
0

连接查询我奋力这个sql查询奋力左转换成JPQL

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

回答

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 
+0

感谢您的帮助。我没有看到这个,并添加了连接子句作为'where(rf.role.roleId =:roleId)OR(f.roleFeatures is EMPTY)“' – 2012-01-12 20:53:38