仅查询基类

本文关键字:基类 查询 | 更新日期: 2023-09-27 18:06:59

具有以下结构:

  • Article : IArticle
  • SuperArticle : Article
  • AwesomeArticle : Article

Article不是抽象的,有些项目只是冠词,有些是派生类型。下面是我的NHibernate配置,遵循每个层次表的策略(因为子类也在主表上,并且可能包含也可能不包含其他表中的附加数据):

<class name="IArticle" table="Articles" >
<id name="Id" column="IdArticle"/>
 <discriminator type="string" formula="(CASE WHEN IdTipoDef LIKE 'DefProd8' THEN 'SUPER' ELSE CASE WHEN IdTipoDef LIKE 'DefProd9' THEN 'AWESOME' ELSE  'ARTICLE' END END)"/>
<property name="Description" column="Descrip"/>
<subclass name="SuperArticle" discriminator-value="SUPER">
    <join table="otherTable">
        ...
    </join>
</subclass>
<subclass name="AwesomeArticle" discriminator-value="AWESOME">
    <join table="otherOtherTable">
      ...
    </join>
</subclass>
<subclass name="Article" discriminator-value="ARTICLE">
</subclass>
</class>

问题是,当我试图查询那些只是Article,它返回它的子类,如果我尝试计数,我得到一个错误:

 [TestMethod]
    public void EncuentraArticulosTest()
    {
        ISession session = NHibernateHelper.GetSession();
        session.BeginTransaction();
        Debug.Write(session.QueryOver<Article>().Where(a => a.GetType() == typeof(Article)).RowCount());
        Assert.IsTrue(session.QueryOver<Article>().RowCount() > 0);
        session.Close();
    }

这(AssertDebug)给出以下异常:

Seguimiento de la pila de Result:   
en NHibernate.Impl.AbstractQueryImpl.UniqueElement(IList list)
en NHibernate.Impl.CriteriaImpl.UniqueResult[T]()
en NHibernate.Criterion.QueryOver`1.SingleOrDefault[U]()
en NHibernate.Criterion.QueryOver`1.NHibernate.IQueryOver<TRoot>.RowCount()
en MyCompany.Test.NHibernateTests.EncuentraArticulosTest() en ...'NHibernateTests.cs:línea 36
Mensaje de Result:  
El método de prueba MyCompany.Test.NHibernateTests.EncuentraArticulosTest produjo la excepción: 
NHibernate.NonUniqueResultException: query did not return a unique result: 7

仅查询基类

这是设计的结果,因为派生类是基类型。这是典型的面向对象多态性。

如果你真的只需要获得基类实体,请参阅此票据。

NHibernate:只加载基类对象

最后我从Java版本(Hibernate)中找到了这个答案:

如何在Hibernate中执行非多态HQL查询?