NHibernate - запрос «многие ко многим» с использованием Junction / Joiner Table
Я нашел очень похожие вопросы здесь, но ни один не соответствует точно тому, что я ищу. Две самые близкие темы, которые я нашел (да, это разные темы):
Критерий «многие ко многим» (1)
Критерий «многие ко многим» (2)
Тем не менее, я думаю, что оба используют прямые отношения «многие ко многим». На самом деле я моделирую отношение «многие ко многим», имея два отношения «один ко многим» с соединительной таблицей, что является довольно стандартной практикой. Вот мои отображения NHibernate:
файлы:
<class name="Files" table="files">
<id name="id">
<generator class="identity" />
</id>
<property name="name" />
<bag name="files_attrs" table="files_attrs" lazy="true">
<key column="file_id" />
<one-to-many class="Files_Attrs" />
</bag>
</class>
Атрибуты:
<class name="Attrs" table="attrs">
<id name="id">
<generator class="identity" />
</id>
<property name="name" />
<property name="value" />
<bag name="files_attrs" table="files_attrs" lazy="true">
<key column="attr_id" />
<one-to-many class="Files_Attrs" />
</bag>
</class>
Столяр:
<class name="Files_Attrs" table="files_attrs">
<id name ="id">
<generator class="identity" />
</id>
<many-to-one name="file" cascade="all" column="file_id" />
<many-to-one name="attr" cascade="all" column="attr_id" />
</class>
Так что моя проблема точно такая же, как вторая ссылка выше, но сделанная с помощью Junction Table. Так:
Учитывая набор идентификаторов атрибутов, я надеюсь запустить запрос, который выдаст мне файлы, в которых есть ВСЕ соответствующие атрибуты. Я могу легко выполнить «n» запросов для каждого идентификатора атрибута в наборе и сравнить каждый список с идентификаторами файлов, которые появляются в каждом списке, но я чувствую, что должен быть более простой способ сделать это все сразу одним запросом.
Пример:
File | Attributes
----------+-----------------------------------------------------
foo.txt | (mode = read-only, view = visible)
bar.txt | (mode = read-write, security = all, view = visible)
duck.txt | (mode = read-only, view = hidden)
goose.txt | (more = read-only, security = owner, view = visible)
Учитывая эти атрибуты:mode = read-only
а такжеview = visible
Я хочу, чтобы меня вернули толькоfoo.txt
а такжеgoose.txt
.
Кто-нибудь может мне с этим помочь? Благодарю.