2010-12-09 79 views
10

Je veux vérifier si au moins un élément d'une collection (u.organisations) est contenu dans une autre collection (? = excludedOrganisations):HQL: Un élément d'une collection dans une autre collection?

select distinct u from SystemUser u 
join u.userGroups g 
join u.organisations o 
where 3 in elements(g.permissions) and 
EACH_ELEMENT_OF(o) not in (?) 

Comment puis-je exprimer la EACH_ELEMENT_OF avec HQL?

Mon dernier essai est:

select distinct u from SystemUser u 
join u.userGroups g 
where 3 in elements(g.permissions) and 
not exists (
    select org from Organisation org 
    where org in elements(u.organisations) 
    and org not in (?) 
) 

Mais je reçois l'exception:

IllegalArgumentException occurred calling getter of Organisation.id 
+0

Hey, avez-vous fait des progrès dans ce domaine? – octav

+0

Ma solution de contournement est avec une boucle forcée ce qui est possible avec relativement peu d'éléments. – deamon

+0

Essayez de passer au lieu d'une liste d'organisations, une liste avec seulement leurs identifiants. J'ai essayé quelque chose de similaire et ça a marché. – octav

Répondre

0

Je suppose que vous avez besoin d'une sous-requête pour l'exprimer dans SQL, sous-requête donc est également nécessaire dans HQL:

select u from SystemUser u 
where not exists (
    select 1 from UserGroup g where g.user = u and g not in (?) 
) 
+0

Cela ne fonctionne pas, peut-être parce que chaque UserGroup peut avoir plusieurs utilisateurs. – deamon

+0

J'ai aussi essayé 'select 1 de UserGroup g où u dans les éléments (g.users) et g pas dans (?)' Dans la sous-sélection, mais sans succès. – deamon

+0

Désolé, mon exemple était trop simplifié. Je l'ai retravaillé. – deamon

0

Voici l'exemple classique de la documentation Hibernate:

from Cat as cat 
left join cat.kittens as kitten 
    with kitten.bodyWeight > 10.0 

Dans votre cas, ce serait:

select distinct u from SystemUser u 
join u.userGroups g 
join u.organisations o 
where 3 in elements(g.permissions) and 
o.id not in (?) 

Je suppose que l'entité Organisation a un champ id et vous pouvez passer dans la liste des ids.

+0

L'organisation a un champ id. Mais quand j'essaie d'exécuter votre requête, je reçois: org.hibernate.collection.PersistentSet ne peut pas être converti en java.lang.Long – deamon

+0

Et vous passez en paramètre à la requête l'ensemble des identifiants, non? Ce n'est pas l'ensemble des organisations. – octav

+0

C'est un ensemble d'objets Organisation. – deamon