JPQL, Comment ne pas sélectionner quelque chose
Question
J'ai un SQL assez simple je dois faire.
J'ai un ProcessUser
, Role
et une table ProcessUserRole
. Un droit devant beaucoup à plusieurs
Je veux sélectionner tous les années ProcessUser
qui n'ont aussi un rôle d'administrateur.
Cependant, mon JPQL échoue parce que mon utilisateur a également officier de rôle, il est récupéré dans la liste.
Voici le JPQL:
entityManager.createQuery("SELECT p FROM " + ProcessUser.class.getName()
+ " p join p.roles role WHERE role.name NOT IN ('sysadmin')").getResultList();
Le SQL généré est:
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' ) )
La solution
syntaxe JPQL correcte en utilisant une sous-requête:
SELECT p FROM ProcessUser p
WHERE p.id NOT IN (
SELECT p2.id FROM ProcessUser p2
JOIN p2.roles role
WHERE role.name='sysadmin'
)
Autres conseils
Est-ce que ce travail pour vous?
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'
)
Votre requête est basiquement renvoyait une liste des utilisateurs / rôles depuis votre utilisateur a deux rôles il revient deux fois, vous filtrez une ligne en excluant le rôle de « sysadmin ». Ce qu'il semble que vous voulez faire est d'exclure tous les utilisateurs qui ont un rôle de « sysadmin » quel que soit ils ont d'autres rôles. Vous auriez besoin d'ajouter quelque chose à vous interroger comme. (Je vais par votre requête pas votre description)
where processuse0_.id not in
select ( userId from
ProcessUserRoles
inner join
Role
on ProcessUserRoles.roleId=Role.id
where role.name != 'sysadmin'
)
Exécuter une requête imbriquée. Sélectionnez d'abord tous les utilisateurs ayant le rôle de sysadmin. Sélectionnez ensuite le complément de cela, ou tous les utilisateurs qui ne sont pas ce résultat.
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;