2011-06-08 36 views
1

我的應用程序中有一個流暢的nhibernate配置。兩者都運行最新。我正在嘗試創建一個標準語句來撤回連接的子類層次結構中的特定類。這是我的繼承結構的一個例子:NHibernate - 使用加入子類的Criteria排除子類

管理員是一名僱員是一個人(管理員:員工,員工:人)

我想獲得的是員工,但不是管理員,但由於管理員是員工,他們回來查詢。我沒有使用鑑別器列。有什麼方法可以使用Criteria API來完成這個任務嗎?

在此先感謝。

Schema作爲請求(只是一個例子):

Person表:ID,NAME

Employee表:PERSONID,EmployeeNumber

管理員:PERSONID,AdminNumber

NHibernate的涉及那些正確。除此特定類型的查詢外,其他所有工作都可用

+0

如果你沒有使用鑑別器類型的列,NHibernate應該如何區分不同的人類類型? – csano 2011-06-08 18:51:21

+0

嗯,它知道不同的類屬於不同的表,所以你會認爲Criteria API會通過生成的SQL查詢來支持這種排除。 – a432511 2011-06-08 19:10:49

+0

你能用你的模式更新你的問題嗎? – csano 2011-06-08 19:13:36

回答

0

似乎Criteria不支持該功能。我能夠通過向查詢添加SQL限制來過濾出子類結果來解決問題。

criteria.Add(
    Expression.SQL("{alias}.MyPrimaryKey NOT IN (SELECT MyPrimaryKey FROM Admin)")); 

這基本上排除了員工SQL查詢的結果,並且該員工存在於管理表中,因此只返回非管理員的員工。

我最初嘗試通過Criteria分別查詢Admin表以獲取Id列表,然後使用NOT IN Criteria語句將其提供給Employee查詢Restrictions.Not(Restrictions.In())但SQL Server將參數數限制爲2100,您試圖排除的ID集合超過2100項。