由于HQL和ICriteria是域查询工具,我发现很难期望有这样的功能。
唯一接近的方法是使用ICriteria的Expression.Sql()查询超类,但用纯Sql注入子类特定的片段。在那里,表达方式是
crit.Add(
Expression.Sql(@"(({alias}.DiscrimCol = :subClassADiscrimVal AND {alias}.Col2 = :barVal)
OR ({alias}.DiscrimCol = :subClassBDiscrimVal AND {alias}.Col3 = :barVal))",
new object[] { "subA", "subB", "bar" },
new IType[] { NHibernateUtil.String,NHibernateUtil.String,NHibernateUtil.String } )
);
不太好,但很管用
另一种方法是使用
ISQLQuery
它至少允许选择部分是特定于域的(并且使用
.AddEntity()
)因此,您仍然可以选择托管超类和WHERE部分包含特定于子类的片段
==========更新==========
再想一想,有一种方法可以通过HQL或ICriteria实现这一点,但它更多地是一种解决方法,而且性能较差,因为它涉及子查询。ICriteria中的示例:
nhSes.CreateCriteria(typeof(Super))
.Add(
Restrictions.Disjunction()
.Add(Subqueries.PropertyIn("Id", DetachedCriteria.For(typeof(ChildA))
.SetProjection(Projections.Id())
.Add(Restrictions.Eq("ChildAProp", barVal))))
.Add(Subqueries.PropertyIn("Id", DetachedCriteria.For(typeof(ChildB))
.SetProjection(Projections.Id())
.Add(Restrictions.Eq("ChildBProp", barVal))))
)