2010-12-09 18 views
10

ich, ob zumindest ein Element aus einer Sammlung überprüfen möchte (u.organisations) in einer anderen Sammlung enthalten ist (? = excludedOrganisations):HQL: Ist ein Element einer Sammlung in einer anderen Sammlung?

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 (?) 

Wie kann ich die EACH_ELEMENT_OF mit HQL auszudrücken?

Mein letzter Versuch ist:

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 (?) 
) 

Aber ich bekomme die Ausnahme:

IllegalArgumentException occurred calling getter of Organisation.id 
+0

Hey, hast du damit Fortschritte gemacht? – octav

+0

Meine Abhilfe ist mit einer for-Schleife, was mit relativ wenigen Elementen möglich ist. – deamon

+0

Versuchen Sie, anstelle einer Liste von Organisationen eine Liste mit nur ihren IDs zu übergeben. Ich habe etwas ähnliches versucht und es hat funktioniert. – octav

Antwort

0

Ich denke, man eine Unterabfrage muß es in SQL zum Ausdruck bringen, damit auch in HQL benötigt wird Unterabfrage:

+0

Es funktioniert nicht, vielleicht weil jede UserGroup mehrere Benutzer haben kann. – deamon

+0

Ich habe auch versucht, wählen Sie 1 aus UserGroup g, wo Sie in Elemente (g.users) und g nicht in (?) 'In der Subselect, aber ohne Erfolg. – deamon

+0

Entschuldigung, mein Beispiel wurde zu sehr vereinfacht. Ich habe es überarbeitet. – deamon

0

Dies ist das klassische Beispiel aus der Hibernate-Dokumentation:

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

In Ihrem Fall wäre dies:

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 (?) 

Ich bin die Organisation Einheit hat ein ID-Feld unter der Annahme, und Sie in der Liste des IDs passieren können.

+0

Die Organisation hat ein ID-Feld. Aber wenn ich versuche, Ihre Abfrage auszuführen, bekomme ich: org.hibernate.collection.PersistentSet kann nicht in java.lang.Long umgewandelt werden – deamon

+0

Und Sie übergeben als Parameter an die Abfrage die Menge der IDs, richtig? Nicht der Satz von Organisationen. – octav

+0

Es ist eine Gruppe von Organisationsobjekten. – deamon

Verwandte Themen