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'
            )
        )
Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top