[NHibernate]條件查詢Criteria Query


 目錄

寫在前面

文檔與系列文章

條件查詢

一個例子

總結

寫在前面

上篇文章介紹了HQL查詢,我個人覺得使用ORM框架就是為了讓少些sql,提高開發效率,而再使用HQL就好像還是使用sql,就覺得有點又回到使用sql的年代。但是完全不用hql也不是絕對的,HQL更接近原生態的sql,對於一些比較復雜的查詢,HQL的作用就體現出來了。作為使用面向對象語言的程序員,有時更願意采用面向對象的方式去思考問題,去實現查詢,這就是本篇文章要學習的條件查詢(Criteria Query)。

文檔與系列文章

[Nhibernate]體系結構

[NHibernate]ISessionFactory配置

[NHibernate]持久化類(Persistent Classes)

[NHibernate]O/R Mapping基礎

[NHibernate]集合類(Collections)映射 

[NHibernate]關聯映射

[NHibernate]Parent/Child

[NHibernate]緩存(NHibernate.Caches)

[NHibernate]NHibernate.Tool.hbm2net

[NHibernate]Nullables

[NHibernate]Nhibernate如何映射sqlserver中image字段

[NHibernate]基本配置與測試 

[NHibernate]HQL查詢 

條件查詢

Criteria Query通過面向對象化的設計,將數據查詢條件封裝為一個對象。再直白點講就是,Criteria Query可以看作是傳統SQL的對象化表示。

在Nhibernate中提供了條件查詢的Criteria API,在程序中可以通過ISession創建ICriteria實例,並在ICriteria對象上設置一個或者多個表達式,然后從數據庫

中查詢獲得對象的列表。

創建ICriteria對象

代碼描述:通過ISession創建一個ICriteria實例,然后返回最多50條客戶信息的集合。

 1         /// <summary>
 2         /// 通過條件查詢Criteria查詢顧客信息
 3         /// </summary>
 4         /// <returns></returns>
 5         public IList<Customer> GetCustomers()
 6         {
 7             NHibernateHelper nhibernateHelper = new NHibernateHelper();
 8             //獲得ISession實例
 9             ISession session = nhibernateHelper.GetSession();
10             //通過ISession創建ICriteria實例
11             ICriteria criteria = session.CreateCriteria(typeof(Customer));
12             // Set a limit upon the number of objects to be retrieved
13             //漢:設置最大的檢索對象個數
14             criteria.SetMaxResults(50);
15             return criteria.List<Customer>();
16         }

使用條件查詢ICriteria,可以通過Restrictions添加限制條件來限制結果集。
Criteria Query常用的查詢限制方法

方法 描述

Restrictions.eq()

equal,=

Restrictions.allEq()

使用key/value進行多個等於的對比,等價於使用多個Restrictions.eq()的效果

Restrictions.gt()

greater-than, >

Restrictions.lt()

less-than, <

Restrictions.le()

less-equal, <=

Restrictions.between()

在什么之間,類似sql中的between

Restrictions.like()

類似sql中的like,模糊查詢

Restrictions.in()

在什么之內,類似於sql中的in

Restrictions.and()

並且

Restrictions.or()

或者

Restrictions.isNull()

是否為null

Restrictions.isNotNull()

是否不為null,與上相反。

Order.asc()

根據傳入的字段進行升序排序。

Order.desc()

根據傳入的字段進行降序排序。

MatchMode.EXACT

字符串精確匹配,相當於“like 'value'

MatchMode.ANYWHERE

字符串在中間位置,相當於“like '%value%'

MatchMode.START(END)

字符串在最前面的位置,相當於“like 'value%'”("like '%value'") 

一個例子

首先引入命名空間

using NHibernate.Criterion;
 1         /// <summary>
 2         /// 通過條件查詢Criteria查詢顧客信息
 3         /// </summary>
 4         /// <returns></returns>
 5         public IList<Customer> GetCustomers()
 6         {
 7             NHibernateHelper nhibernateHelper = new NHibernateHelper();
 8             //獲得ISession實例
 9             ISession session = nhibernateHelper.GetSession();
10             //通過ISession創建ICriteria實例
11             ICriteria criteria = session.CreateCriteria(typeof(Customer));
12             //查詢名字以w開頭的客戶信息。
13             criteria.Add(Restrictions.Like("CustomerName", "w%"));
14             //另一種方式
15             criteria.Add(Restrictions.Like("CustomerName", "w", MatchMode.Start));
16             //查詢名字在wolfy和zhangsan內的客戶信息
17             criteria.Add(Restrictions.In("CustomerName", new string[] { "zhangsan", "wolfy" }));
18             //查詢名稱不為null的客戶信息
19             criteria.Add(Restrictions.IsNotNull("CustomerName"));
20             //查詢名稱等於wolfy的客戶
21             criteria.Add(Restrictions.Eq("CustomerName", "wolfy"));
22             //查地址是北京海淀區 並且名字為wolfy的客戶
23             criteria.Add(Restrictions.And(Restrictions.Like("CustomerAddress", "北京%"), Restrictions.Eq("CustomerName", "wolfy")));
24             //按照名字升序排列
25             criteria.AddOrder(NHibernate.Criterion.Order.Asc("CustomerName"));
26             return criteria.List<Customer>();
27         }

看一下生成的sql是什么?

 

總結

同樣在Criteria 查詢中使用FetchMode來實現連接限制,這里就不再舉例了,感興趣的可以自己試一試。

說實話,在項目中從沒發現使用條件查詢的地方,一些查詢的方法都是千篇一律的,時間久了,絕對會膩了。如過你在項目中采用了該種方式,是不是瞬間覺得高大上了?我還是引用自己在前面說過的那句話,實現一個業務有A,B,C三種方式,而A是你經常用的,閉着眼都能把每個單詞背出來了,你還在用,為啥不嘗試一下B和c兩種方式。

通過本篇的學習,我們了解了條件查詢,在限制結果集方面做的還是非常好的,提供了常用的限制方法,更接近咱們的思維方式,何不在項目中使用起來,也讓咱們的代碼充滿靈氣,而不是千篇一律,死氣沉沉的代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM