2009-02-27 3 views
0

J'ai une question à propos de nHibernate et du filtrage. J'utilise nHibernate 2.2 mais je pense que cela s'appliquera aux versions dès 1.2.Comment puis-je appliquer un filtre aux grands-parents dans nHibernate?

J'ai créé un exemple simple pour illustrer le problème. J'ai trois objets de domaine: Pays, État et Ville (supposons que les tables de base de données correspondent au domaine et que les relations appropriées soient définies.) Je veux sélectionner les villes appartenant à un pays spécifique à l'aide de filtres nHibernate. filtres correctement et le filtre par l'état (le parent) fonctionne très bien

J'ai inclus le modèle de domaine et ma cartographie NHibernate ci-dessous ma requête est une simple déclaration 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 cartographie:

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

Répondre

0

J'ai passé beaucoup de temps à faire des recherches sur ce sujet et j'ai déterminé que nHibernate n'appliquera pas de filtres imbriqués. La solution consiste à gérer le problème par programme et à commencer par le parent, en retournant une liste filtrée puis en créant une liste de tous les enfants appartenant aux parents filtrés. Donc, dans mon exemple, je voudrais charger tous les états appartenant à un pays particulier et ensuite construire une liste des villes-enfants des états.

Questions connexes