Запрос дискриминатором в NHibernate - PullRequest
5 голосов
/ 17 января 2011

Я немного искал и ничего не нашел.Можно ли создать запрос Hibernate для возврата набора объектов на основе дискриминатора?

У меня есть класс AbstractUser, который расширен конкретными классами UserTypeA и UserTypeB.Я использую модель таблицы на иерархию для сопоставления своих классов в NHibernate, поэтому UserTypeA и UserTypeB хранятся в одной таблице с разными значениями дискриминатора.Вот мое свойство сопоставления дискриминатора:

<discriminator column="Type" type="string"/>

В моей таблице есть столбец, содержащий имя типа пользователя.Мне интересно, возможно ли выполнить запрос NHibernate, используя это.

Я пробовал это:

public IList<DomainBase> FindByType(string typeName, Type type)
{
    string query = "from " + type.Name + " k where k.Type = " + typeName;
    return Session.CreateQuery(query).List<DomainBase>();
}

Но так как тип на самом деле не является свойством класса, простотаблица, это, очевидно, не работает.Казалось бы излишним иметь как свойство для этой цели, так и дискриминатор, если нет способа использовать свойство в качестве дискриминатора?

Ответы [ 2 ]

6 голосов
/ 17 января 2011

На самом деле, это хорошо задокументировано на http://www.nhibernate.info/doc/nh/en/index.html#queryhql-where:

Аналогично, особая собственность class получает доступ к значению дискриминатора экземпляр в случае полиморфного упорство. Имя класса .Net встроен в пункт, где будет переводится в значение дискриминатора.

 from Eg.Cat cat where cat.class = Eg.DomesticCat

Вы также можете передать экземпляр System.Type в качестве параметра.

2 голосов
/ 17 января 2011

Если вы действительно хотите запрашивать только тип, то я думаю, что использование ICriteria API является более удобным вариантом:

public IList<T> FindByType<T>()
{
    return Session.CreateCriteria(typeof(T)).List<T>();
}

Теперь вы можете использовать его как IList<UserTypeB> list = FindByType<UserTypeB>().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...