寫在前面html
文檔與系列文章程序員
條件查詢sql
一個例子數據庫
總結緩存
上篇文章介紹了HQL查詢,我我的以爲使用ORM框架就是爲了讓少些sql,提升開發效率,而再使用HQL就好像仍是使用sql,就以爲有點又回到使用sql的年代。可是徹底不用hql也不是絕對的,HQL更接近原生態的sql,對於一些比較複雜的查詢,HQL的做用就體現出來了。做爲使用面嚮對象語言的程序員,有時更願意採用面向對象的方式去思考問題,去實現查詢,這就是本篇文章要學習的條件查詢(Criteria Query)。session
[NHibernate]ISessionFactory配置框架
[NHibernate]持久化類(Persistent Classes)less
[NHibernate]O/R Mapping基礎sqlserver
[NHibernate]集合類(Collections)映射
[NHibernate]緩存(NHibernate.Caches)
[NHibernate]NHibernate.Tool.hbm2net
[NHibernate]Nhibernate如何映射sqlserver中image字段
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兩種方式。
經過本篇的學習,咱們瞭解了條件查詢,在限制結果集方面作的仍是很是好的,提供了經常使用的限制方法,更接近我們的思惟方式,何不在項目中使用起來,也讓我們的代碼充滿靈氣,而不是千篇一概,死氣沉沉的代碼。