在NHibernate中通过鉴别器进行查询

时间:2011-01-17 00:03:27

标签: c# nhibernate

我做了一些搜索并没有发现任何事情。是否可以创建一个Hibernate查询以基于鉴别器返回一组对象?

我有一个AbstractUser类,它由具体类UserTypeA和UserTypeB扩展。我正在使用table-per-hierarchy模型在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>();
}

但是由于Type实际上不是该类的属性,只是表中的一列,这显然不起作用。除非有一种方法可以使用属性作为鉴别器,否则同时拥有一个属性和一个鉴别器似乎是多余的?

2 个答案:

答案 0 :(得分:6)

实际上,http://www.nhibernate.info/doc/nh/en/index.html#queryhql-where

已详细记录了这一点
  

同样,特殊属性class   访问一个的鉴别器值   在多态的情况下的实例   持久性。 .Net类名   嵌入在where子句中   转化为其鉴别者价值。

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

您还可以将System.Type实例作为参数传递。

答案 1 :(得分:2)

如果您真的只想查询类型,那么我认为使用ICriteria API是一个更方便的选择:

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

现在您可以像IList<UserTypeB> list = FindByType<UserTypeB>()一样使用它。