2009-02-27 7 views
0

私はnHibernateとフィルタリングに関する質問があります。私はnHibernate 2.2を使用していますが、これは1.2までのバージョンにも適用されると思います。nHibernateの祖父母にフィルタを適用するにはどうすればよいですか?

問題を説明するための簡単な例を作成しました。私は3つのドメインオブジェクトを持っています:国、州、都市(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はマッピング:

<?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> 

答えて

0

私はこれを研究するのに多くの時間を費やし、nHibernateがネストされたフィルタを適用しないことを決定しました。解決策は、問題をプログラム的に処理し、親から始まり、フィルタリングされたリストを返し、フィルタされた親に属するすべての子のリストを構築することです。

私の例では、特定の国に属するすべての州を読み込み、州の子都市のリストを作成します。

関連する問題