2010-06-21 9 views
7

Ich habe eine Klasse, die eine Sammlung hat, als Tasche in meiner nHibernate Mapping-Datei für diese Klasse zugeordnet, und ich möchte alle Instanzen der Klasse zurückgeben, deren Sammlung eine oder mehrere hat der Objekte, die ich in gebenÜberprüfen der Schnittmenge zweier Sammlungen über HQL

. Beispiel:

My Parent-Klasse wird DocumentDefinition genannt. Es verfügt über eine Sammlung von Rollen, einer nHibernate-Entität, auf die das Dokument zugreifen kann. Diese beiden sind über ein Viele-zu-Viele-Mapping verbunden. Ich mag die Abfrage eine Sammlung von Rollen zu übergeben und alle DocumentDefinition Instanzen zurück, die eine oder mehr von einem dieser Rollen in

Mapping auf Übergeordnete Klasse, DocumentDefinition bestanden hat.

<bag name="AllowedRoles" table="Many-To-Many Table" lazy="false"> 
     <key column="ParentDefinition" /> //Column from Many-To-Many Table 
     <many-to-many class="MyRolesClass" column="ParentRole" /> //Column from Many-To-Many Table 
</bag> 

Beispiel das, was ich bisher haben versucht.

Select distinct d from DocumentDefinition d, MyRolesClass r where r in :roles and r in elements(d.Group) 

Rollen der Sammlung sein ich möchte in passieren

so wie mache ich eine Abfrage DocumentDefi zurückzukehren nitionen, wobei r (Roles-Klasse) sowohl in der übergebenen Parameterliste als auch in der Auflistung des DocumentDefinition-Objekts enthalten ist.

Hoffe, das ist klar! Prost!

Antwort

7

Sie waren ganz in der Nähe ... die Abfrage sein sollte:

select distinct d 
from DocumentDefinition d, MyRolesClass r 
where r in (:roles) and r in elements(d.AllowedRoles) 

Und Sie die gewünschten Rollen senden .SetParameterList("roles", collectionOfRoles) verwenden.

BTW, ich habe den Sammlungsnamen geändert, der nicht mit dem von Ihnen geposteten Mapping übereinstimmt.

Noch eine Sache zu beachten: faul = "falsch" ist fast immer eine schlechte Idee für Sammlungen.

+0

Prost! Arbeitete perfekt. Kann nicht glauben, dass ich es nicht verstanden habe! Entschuldigung für das Mapping. Ich ändere die Namen, damit sie leichter zu verstehen sind als die tatsächlichen, die außerhalb des Kontextes liegen. – Damien