题
我有一个非常简单的SQL,需要执行。
我有一个 ProcessUser
, Role
和 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是:
select distinct processuse0_.id as id8_, processuse0_.position as position8_, processuse0_.username as username8_, processuse0_.organization_id as organiza9_8_, processuse0_.passwordHash as password4_8_, processuse0_.fromEmail as fromEmail8_, processuse0_.firstname as firstname8_, processuse0_.lastname as lastname8_, processuse0_.processes as processes8_ from ProcessUser processuse0_ inner join ProcessUserRoles roles1_ on processuse0_.id=roles1_.userId inner join Role role2_ on roles1_.roleId=role2_.id where ( role2_.name not in ( 'sysadmin' ) )
解决方案
使用子查询的正确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'
)
其他提示
这个适合您吗?
SELECT *
FROM ProcessUser
WHERE Exists
(
SELECT 1
FROM
ProcessUserRoles
INNER JOIN Roles
ON Roles.RoleId = ProcessUserRoles.RoleId
WHERE 1=1
AND ProcessUser.ProcessUserId = ProcessUserRoles.ProcessUserId
AND Roles.RoleDescription = 'Super User'
)
您的查询基本上可以带回用户/角色列表,因为您的用户有两个角色返回两次,您可以通过排除“ sysadmin”的角色来过滤一行。听起来您想做的是排除所有具有“ sysadmin”角色的用户,无论他们扮演其他角色。您需要在您的查询中添加一些东西。 (我要查询您的描述,而不是您的描述)
where processuse0_.id not in
select ( userId from
ProcessUserRoles
inner join
Role
on ProcessUserRoles.roleId=Role.id
where role.name != 'sysadmin'
)
运行一个嵌套查询。首先选择Sysadmin的作用所有用户。然后选择此结果的补充,或者没有在此结果中的所有用户。
JPQL:
TypedQuery<ProcessUser> query = em.createQuery("" +
" SELECT p FROM ProcessUser p " +
" WHERE p.roles.name <> ?1", ProcessUser.class);
query.setParameter(1, "sysadmin");
return query.getResultList;
不隶属于 StackOverflow