Вопрос
У меня довольно простой 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;