我有一个非常简单的SQL需要执行。
我有一个ProcessUser
,Role
和一个ProcessUserRole
表。一个直接的多对多
我想选择同时具有admin角色的所有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' ) )
答案 0 :(得分:18)
使用子查询的正确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'
)
答案 1 :(得分:1)
这对你有用吗?
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'
)
答案 2 :(得分:1)
您的查询基本上会带回一个用户/角色列表,因为您的用户有两个角色,他两次返回,您通过排除'sysadmin'的角色来过滤掉一行。您想要做的是排除所有具有“sysadmin”角色的用户,无论他们是否具有其他角色。你需要添加一些东西给你查询。 (我的查询不是你的描述)
where processuse0_.id not in
select ( userId from
ProcessUserRoles
inner join
Role
on ProcessUserRoles.roleId=Role.id
where role.name != 'sysadmin'
)
答案 3 :(得分:0)
运行嵌套查询。首先选择具有sysadmin角色的所有用户。然后选择此补充或所有不在此结果中的用户。
答案 4 :(得分:0)
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;