Проверка пересечения двух коллекций через HQL - PullRequest
8 голосов
/ 21 июня 2010

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

Пример:

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

Отображение в родительский класс 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)

Роли, являющиеся коллекцией, которую я хочу передать.

Итак, как мне сделать запрос для возврата DocumentDefinitions где r (Roles Class)находится как в переданном списке параметров, так и в коллекции объекта DocumentDefinition.

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

1 Ответ

8 голосов
/ 22 июня 2010

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

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

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

Кстати, я изменил название коллекции, котораяне соответствует отображению, которое вы опубликовали.

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

...