由於HQL和ICriteria是域查詢工具,我發現很難期望這樣的功能。
AFAIK唯一接近的事情是使用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
至少允許SELECT部分是特定領域(以及使用.AddEntity()
),這樣你就可以仍然選擇管理超和WHERE部分包含的子類特異性片段
========= UPDATE ==========
退一步講,有一種方法通過HQL或ICri實現這一點但它更多的是解決方法,性能較差,因爲它涉及子查詢。例如在的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))))
)
我正在quering每個孩子,項目的ID,然後選擇超類,從投影子ID限制的ID在。
謝謝你;不幸的是,除了使用本地sql之外,沒有更清晰的方法。我想知道進行工會運作是否會是更好的選擇? – DanP 2010-07-29 16:40:19
chech更新 – Jaguar 2010-07-30 10:33:35