nhibernate入门系列: 使用Criteria载入对象
nh會話提供一種使用表達式(就像SQL語句的where表達式)來載入數據的方法, 以取得滿足條件的對象集合。
通過CreateCriteria方法, 可以取得一個ICriteria接口, 這個接口用于操作表達式和排序字段. 由CriteriaImpl類實現,此類加有Internal修飾,因此不能在程序集外顯示創建, CreateCriteria方法需要一個要加載對象類型的參數.
這里列出ICriteria接口中的一些常用方法:
Add:加入條件表達式(Expression對象),此方法可多次調用以組合多個條件;
AddOrder:加入排序的字段(Order對象);
List:執行查詢, 返回滿足條件的對象集合。
SetMaxResults:設置返回的最大結果數,可用于分頁;
SetFirstResult:設置首個對象返回的位置,可用于分頁;
SetTimeout:設置操作的超時值,此值將傳遞給IDbCommand對象;
Expression(表達式)
Expression類是所有表達式類的祖先. 這是一個抽象(abstract)類, 同時也是一個類工廠(Factory Method模式), 用于創建派生的表達式對象, 用意是很明顯的, 隱藏了派生類的細節,使我們可通過一致的方法來創建表達式對象.
下面列出一些Expression中常用的方法:
Eq:得到一個相等判斷的表達式, 等同于 propertyName = value;
Gt:得到一個大于判斷的表達式, 等同于 propertyName > value;
Like:得到一個相似判斷的表達式, 等同于 propertyName like value;
And:得到兩個表達式And操作后的表達式, 等同于 expression1 and expression2;
Or:重到兩個表達式Or操作后的表達式, 等同于 expression1 or expression2;
更多的Expression請參考相關文檔或源代碼。
Order(排序)
Order類用于向ICriteria接口提供排序信息. 這個類提供了兩個靜態方法, 分別是Asc和Desc, 顧名思義就是創建升序和降序的Order對象.
例如要取得一個按更新日期(Updated)降序的Order對象, 使用Order.Desc("Updated")就可以了.
示例
下面以幾個例子來說明使用Criteria載入對象的用法:
1. 取得用戶名(Username)為billy的用戶對象:
? ?Expression ex = Expression.Eq( "Username", "billy" ); // ( Username = 'billy' )
???IList users = session.CreateCriteria(typeof(User)).Add( ex ).List();
2。取得用戶名(Username)為billy, 密碼(Password)為123456的用戶對象
???Expression ex = Expression.And(
???????Expression.Eq("Username", "billy"),
???????Expression.Eq("Password", "123456")
???); // ( Username='billy' and Password='123456' )
???IList users = session.CreateCriteria(type(User)).Add( ex ).List();
3. 取得數據中第20-40的用戶對象。
???ICriteria c = session.CreateCriteria(typeof(User));
?? IList users = c.SetFirstResult(20).SetMaxResults(20).List();
???對于SQLSERVER,數據定位采用的是IDataReader前滾至firstResult處,然后取maxResults條記錄.
4. 取得按注冊日期(Regdate)降序排序后的用戶對象.
???ICriteria c = session.CreateCriteria(typeof(User));
?? IList users = c.AddOrder( Order.Desc("Regdate") ).List();
使用Criteria加載數據的不足:
1. 當使用SetFirstResult和SetMaxResults限制返回的對象數時,無法得知對象的總數;
2. 當前版本不支持關聯查詢(hibernate好像可以);
總結
以上是生活随笔為你收集整理的nhibernate入门系列: 使用Criteria载入对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全flash站制作剖析
- 下一篇: 防火墙x86架构和ASIC架构和NP架构