我需要执行一个非常简单的SQL。

我有一个ProcessUserRole和一个ProcessUserRole表。直接多对多

我想选择所有也具有管理员角色的ProcessUser

但是,我的JPQL失败,因为我的用户还具有角色官员,因此在列表中对其进行了检索。

这是JPQL:

entityManager.createQuery("SELECT p FROM " + ProcessUser.class.getName()
  + " p join p.roles role WHERE role.name NOT IN ('sysadmin')").getResultList();


生成的SQL是:

选择
作为id8_的不同processuse0_.id,
processuse0_.position作为position8_,
processuse0_.username作为username8_,
processuse0_.organization_id为organiza9_8_,
processuse0_.passwordHash作为password4_8_,
processuse0_.fromEmail作为fromEmail8_,
processuse0_.firstname作为firstname8_,
processuse0_.lastname作为lastname8_,
processuse0_.processes作为process8_

ProcessUser processuse0_
内部联接
ProcessUserRoles角色1_
在processuse0_.id = roles1_.userId上
内部联接
角色role2_
在role1_.roleId = role2_.id上
哪里

role2_.name不在(
'系统管理员'

最佳答案

使用子查询的正确JPQL语法:

SELECT p FROM ProcessUser p
 WHERE p.id  NOT IN (
  SELECT p2.id FROM ProcessUser p2
    JOIN p2.roles role
   WHERE role.name='sysadmin'
 )

10-04 11:34