2010-06-21 2 views
7

У меня есть класс, который имеет коллекцию, отображаемую как сумку в моем файле сопоставления nHibernate для этого класса, и я хочу вернуть все экземпляры этого класса, чья коллекция имеет один или несколько объекты, которые я прохожу вПроверка пересечения двух коллекций через HQL

Пример:.

Моего родительский класса называется DocumentDefinition. Он имеет набор ролей, который является объектом nHibernate, к которому к документу можно получить доступ. Эти два связаны с помощью сопоставления Many-To-Many. Я хочу передать в запросе коллекцию ролей и вернуть все экземпляры DocumentDefinition, которые имеют один или более одного из этих ролей, принятых в

Mapping на классе Parent, DocumentDefinition:.

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

Пример того, что я пытались до сих пор:.

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

Роли является коллекция Я хочу пройти в

так как же я могу сделать запрос, возвращающий DocumentDefi где r (класс ролей) находится как в списке параметров, переданном, так и в коллекции объекта DocumentDefinition.

Надеюсь, что это ясно! Ура!

ответ

7

Вы были очень близки ... запрос должен быть:

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

И вы отправляете желаемые роли, используя .SetParameterList("roles", collectionOfRoles).

BTW, я изменил имя коллекции, которое не соответствует отображаемому вами картографированию.

Еще одна вещь, которую следует учитывать: lazy = "false" - почти всегда плохая идея для коллекций.

+0

Приветствия! Работала отлично. Не могу поверить, что я не понял! Извините за сопоставление. Я меняю имена, чтобы их было легче понять, чем реальные, вне контекста. – Damien

Смежные вопросы