【问题标题】:Query by discriminator in NHibernateNHibernate中的鉴别器查询
【发布时间】:2011-01-17 00:03:26
【问题描述】:

我对此进行了一些搜索,但没有找到任何东西。是否可以创建一个 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实际上不是类的属性,只是表中的一列,这显然是行不通的。除非有办法将属性用作鉴别器,否则同时拥有用于此目的的属性和鉴别器似乎是多余的?

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    实际上,这在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 实例作为参数传递。

    【讨论】:

    • 标准 API 可以做到这一点吗?
    【解决方案2】:

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

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

    现在你可以像IList&lt;UserTypeB&gt; list = FindByType&lt;UserTypeB&gt;()一样使用它了。

    【讨论】:

      猜你喜欢
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多