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.

Кто-нибудь может мне с этим помочь? Благодарю.

Ответы на вопрос(2)

Ваш ответ на вопрос