2009-07-30 2 views
2

Я использую API критериев NHibernate для загрузки некоторых объектов из моей базы данных. Мой домен состоит из абстрактного класса, Animal, от которого наследуется конкретный класс Cat. Другой конкретный класс, Тигр, наследует от Кат.Как я могу предотвратить запросы NHibernate от возвращаемых подклассов?

нужно загрузить все кошки из базы данных, так что я делаю включено следующее:

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

Что я вывод, что оба Коты и тигры возвращаются запросом, а не только кошки. Это имеет смысл, поскольку Тигр - Кошка. Но в этом конкретном случае я хочу только кошек, а не дополнительных тигров.

Кто-нибудь знает, как я могу это достичь?

ответ

1

Это на самом деле особенность. Но я думаю, что вы можете делать то, что хотите, смешивая «таблицу за классную иерархию» со «таблицей на подкласс». Для этого вам нужен столбец Discriminator, на который вы можете выполнить запрос. Это будет выглядеть следующим образом:

<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>(); 
Смежные вопросы