Как я могу применить фильтр к бабушке и дедушке в nHibernate? - PullRequest
0 голосов
/ 27 февраля 2009

У меня есть вопрос по поводу nHibernate и фильтрации. Я использую nHibernate 2.2, но я думаю, что это применимо к версиям, начиная с 1.2.

Я создал простой пример для иллюстрации проблемы. У меня есть три объекта домена: Страна, Штат и Город (предположим, что таблицы БД соответствуют домену и имеют соответствующие отношения, определенные. Я хочу выбрать города, принадлежащие определенной стране, используя фильтры nHibernate. Я полагаю, что я настроил фильтрует правильно, и фильтр по состоянию (родитель) работает отлично.

Я включил модель домена и мое отображение nHibernate ниже. Мой запрос простой HQL-оператор: select f from city f

Country
 CountryId int
 Name      string
 States    list

State
  StateId   int
  Name      string
  Country   object
  Cities    list
City
  CityId    int
  Name      string
  State     object

Отображение nHibernate:

    <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="CMDB.Model" namespace="CMDB.Model">
  <class name="Country" table="Country" lazy="false">
    <id name="CountryId" type="int" unsaved-value="0">
      <generator class="identity" />
    </id>
    <property name="Name" type="string"/>
    <bag name="States" table="State" inverse="true" lazy="false" cascade="all-delete-orphan">
      <key column="StateId"/>
      <many-to-many class="State" column="StateId"/>
      <filter name="ByCountry" condition=":CountryId = CountryId"/>
    </bag>
  </class>
  <class name="State" table="State" lazy="false">
    <id name="StateId" type="int" unsaved-value="0">
      <generator class="identity" />
    </id>
    <property name="Name" type="string"/>
    <many-to-one name="Country" column="CountryId" class="Country" lazy ="false" />
    <bag name="Cities" table="City" inverse="true" lazy="false" cascade="all-delete-orphan">
      <key column="CityId"/>
      <many-to-many class="City" column="CityId"/>
      <filter name="ByState" condition=":StateId = StateId"/>
    </bag>
    <filter name="ByCountry" condition=":CountryId = CountryId"/>
  </class>
  <class name="City" table="City" lazy="false">
    <id name="CityId" type="int" unsaved-value="0">
      <generator class="identity" />
    </id>
    <property name="Name" type="string"/>
    <many-to-one name="State" column="StateId" class="State" lazy ="false" />
    <filter name="ByState" condition=":StateId = StateId"/>
  </class>
  <filter-def name="ByCountry">
    <filter-param name="CountryId" type="int"/>
  </filter-def>
  <filter-def name="ByState">
    <filter-param name="StateId" type="int"/>
  </filter-def>
</hibernate-mapping>

1 Ответ

0 голосов
/ 13 августа 2009

Я потратил много времени на изучение этого и определил, что nHibernate не будет применять вложенные фильтры. Решение состоит в том, чтобы решить проблему программно и начать с родителя, возвращая отфильтрованный список, а затем составляя список всех детей, принадлежащих отфильтрованным родителям.

Итак, в моем примере я бы загрузил все штаты, принадлежащие определенной стране, а затем составил бы список дочерних городов штатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...