2009-02-27 8 views
0

Ich habe eine Frage zu nHibernate und Filterung. Ich benutze nHibernate 2.2, aber ich denke, das wird für Versionen schon ab 1.2 gelten.Wie kann ich einen Filter auf Großeltern in nHibernate anwenden?

Ich habe ein einfaches Beispiel zur Veranschaulichung des Problems erstellt. Ich habe drei Domänenobjekte: Land, Bundesland und Stadt (angenommen, die DB - Tabellen stimmen mit der Domäne überein und haben die entsprechenden Beziehungen definiert. Ich möchte mit nHibernate - Filtern Städte auswählen, die zu einem bestimmten Land gehören. Ich glaube, ich habe die Filter richtig und der Filter durch Zustand (die Mutter) funktioniert super

ich das Domain-Modell und meine nHibernate Abbildung unten enthalten sind, Meine Abfrage eine einfache HQL-Anweisung lautet:.. 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> 

Antwort

0

Ich habe viel Zeit damit verbracht, dies zu untersuchen und festgestellt, dass nHibernate keine verschachtelten Filter anwenden wird. Die Lösung besteht darin, das Problem programmatisch zu behandeln und mit dem Elternelement zu beginnen, eine Filterliste zurückzugeben und dann eine Liste aller Kinder zu erstellen, die zu den gefilterten Eltern gehören.

Also, in meinem Beispiel würde ich alle Staaten laden, die zu einem bestimmten Land gehören und dann eine Liste der Bundesstaaten des Staates aufbauen.