仅查询基类
本文关键字:基类 查询 | 更新日期: 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();
}
这(Assert
或Debug
)给出以下异常:
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查询?