如何在nHibernate中为祖父母应用过滤器?

时间:2009-02-27 15:28:17

标签: .net nhibernate filter

我对nHibernate和过滤有疑问。我正在使用nHibernate 2.2,但我认为这将适用于1.2版本的版本。

我创建了一个简单的例子来说明问题。我有三个域对象:Country,State和City(假设DB表与域匹配并且定义了适当的关系。我想使用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 Mapping:

    <?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 :(得分:0)

我花了很多时间研究这个并确定nHibernate不会应用嵌套过滤器。解决方案是以编程方式处理问题,并从父级开始,返回一个filterered列表,然后构建属于已过滤父级的所有子级列表。

因此,在我的示例中,我将加载属于特定国家/地区的所有州,然后构建州子城市的列表。