2009-07-30 11 views
2

私はデータベースからいくつかのエンティティをロードするためにNHibernate criteria APIを使用しています。私のドメインは、抽象クラスAnimalから成り立っていて、具体的なCatクラスが継承しています。別の具体的なクラス、TigerはCatから継承しています。私は、データベースからすべての猫をロードする必要があるので、私は私が見つけてる何following-NHibernateクエリがサブクラスを返さないようにするにはどうすればよいですか?

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

をやってる

は、両方の猫、トラが代わりにちょうど猫のクエリによって返されるということです。これはタイガーが猫であるため意味をなさない。しかし、この特別なケースでは、私は猫だけを望んでいて、追加のタイガースは望んでいません。

どのように私はこれを達成することができます知っていますか?

答えて

1

これは実際の機能です。しかし、私はあなたが "table per class"と "table per class hierarchy"を混在させることで、あなたが望むことができると思います。そのためには、Discriminator Columnが必要です。このDiscriminator Columnでクエリを実行できます。これは、次のようになります。この後

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

あなたはこのような弁別列に照会できるようになります。

session.CreateCriteria<Cat>() 
    .Add(Restrictions.IsNull("TYPE")) 
    .List<Cat>(); 
関連する問題