天天看點

在NHibernate的單表繼承模式下通過父類Repository查詢子類

Concrete Table Inheritance(具體表繼承)

Single Table Inheritance(單表繼承)

Class Table Inheritance(類表繼承)

其中單表繼承是我個人比較常用比較推薦的做法。使用單表繼承可以不用Join多個表查詢效率高,而且在Domain Model的屬性提示到父類或者下降到子類時,資料庫模型不用更改。其缺點就是一個資料表的列比較多,而且很多列為空,不過現代的資料庫對空列的壓縮處理已經比較好了,不會産生大量空列造成的性能問題和磁盤空間的浪費。

在NHibernate中經常會遇到通過父類的Repository來查詢子類的情況,比如現在有一個抽象的Employee對象,下面有OfficeUser和Teacher兩個具體的對象,這兩個對象都有其特有的屬性,比如Teacher會有所上司的班級,而OfficeUser卻沒有。我們可以将OfficeUser和Teacher都儲存到Employee表中,然後建立了一個EmployeeRepository,使用Employee作為Query的入口,那麼如果要查詢Employee表中所有的Teacher該怎麼查呢?下面分别用QueryOver、Criteria和HQL來說明:

QueryOver查詢Employee表中的所有Teacher:

這裡需要注意的是,條件中使用的是a.GetType()==typeof(Teacher),但是不能使用a is Teacher,雖然這在C#中是一回事,但是NHibernate會對其了解不一樣,是以必須這麼寫,否則查詢不出來。

Criteria查詢Employee表中的所有Teacher:

HQL查詢Employee表中的所有Teacher:

這裡又不一樣了,where條件後面跟的“Type”是Employee表的Discriminator,是一個列名,也就是通過這一列來區分Employee表的每一條資料到底是OfficeUser還是Teacher。是以,如果你的Discriminator Column是Abc,那麼HQL就要寫成from Employee where Abc='Teacher'。

以上是以最簡單了例子說明了如果通過父類查詢具體的子類的方法,實際項目中肯定比這個查詢要複雜,但是隻要記住了這三種查詢的要點,結合其他條件就可以寫出NHibernate能夠了解的查詢。

本文轉自深藍居部落格園部落格,原文連結:http://www.cnblogs.com/studyzy/archive/2012/07/04/2576902.html,如需轉載請自行聯系原作者