2009-07-30 13 views
2

J'utilise l'API de critères NHibernate pour charger certaines entités de ma base de données. Mon domaine se compose d'une classe abstraite, Animal, dont la classe concrète Cat hérite. Une autre classe concrète, Tiger, hérite de Cat.Comment empêcher les requêtes NHibernate de renvoyer des sous-classes?

J'ai besoin de charger tous les chats de la base de données, donc je fais le suivantes-

ICriteria criteria = session.CreateCriteria(typeof(Cat)); 
return criteria.List<Cat>(); 

Ce que je trouve est que les chats et les tigres sont retournés par la requête au lieu de seulement Cats. Cela a du sens, comme un tigre est un chat. Mais dans ce cas particulier, je ne veux que des chats, et non des tigres supplémentaires.

Est-ce que quelqu'un sait comment je peux y parvenir?

Répondre

1

Ceci est en fait une caractéristique. Mais je pense que vous pouvez faire ce que vous voulez en mélangeant "table par classe hiérarchie" avec "table par sous-classe". Vous avez donc besoin d'une colonne discriminante sur laquelle vous pouvez exécuter la requête. Cela ressemble à ce qui suit:

<class name="Cat" table="Cat"> 
    <id name="Id" type="Int64" column="ID"> 
     <generator class="native"/> 
    </id> 
    <discriminator column="TYPE" type="string"/> 

    <subclass name="Tiger" discriminator-value="TIGER"> 
     <join table="Tiger"> 
      <property name="..." column="..."/> 
     </join> 
    </subclass> 
</class> 

Après cela, vous devriez être en mesure d'interroger sur la discriminateur colonne comme ceci:

session.CreateCriteria<Cat>() 
    .Add(Restrictions.IsNull("TYPE")) 
    .List<Cat>(); 
Questions connexes