Domanda

Ho un abbastanza semplice SQL Ho bisogno di eseguire.

Ho un ProcessUser, Role e un tavolo ProcessUserRole. Un dritto in avanti molti-a-molti

Voglio selezionare tutti ProcessUser di cui non hanno anche un ruolo di amministratore.

Tuttavia il mio JPQL fallisce perché il mio utente ha anche agente di ruolo, per cui viene recuperato nella lista.

Ecco l'JPQL:

entityManager.createQuery("SELECT p FROM " + ProcessUser.class.getName() 
  + " p join p.roles role WHERE role.name NOT IN ('sysadmin')").getResultList();

L'SQL generato è:

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'
            )
        )
È stato utile?

Soluzione

La corretta sintassi JPQL utilizzando subquery:

SELECT p FROM ProcessUser p
 WHERE p.id  NOT IN (
  SELECT p2.id FROM ProcessUser p2
    JOIN p2.roles role
   WHERE role.name='sysadmin'
 )

Altri suggerimenti

Sarà questo lavoro per voi?

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'
)

La vostra richiesta è fondamentalmente riportando un elenco di utenti / ruoli da quando l'utente ha due ruoli torna due volte, filtrare una riga escludendo il ruolo di 'sysadmin'. Che suona come si vuole fare è escludere tutti gli utenti che hanno un ruolo di 'sysadmin' indipendentemente hanno altri ruoli. Si avrebbe bisogno di aggiungere qualcosa si esegue una query simili. (Sto andando a Sua richiesta, non tua descrizione)

  where processuse0_.id not in 
  select ( userId  from 
           ProcessUserRoles
           inner join 
           Role 
           on ProcessUserRoles.roleId=Role.id 
           where role.name != 'sysadmin'

           )

Esegui una query nidificate. Per prima cosa selezionare tutti gli utenti con il ruolo di amministratore di sistema. Quindi selezionare il complemento di questo, o tutti gli utenti che non sono in questo risultato.

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top