写在前面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两种方式。
经过本篇的学习,咱们了解了条件查询,在限制结果集方面作的仍是很是好的,提供了经常使用的限制方法,更接近我们的思惟方式,何不在项目中使用起来,也让我们的代码充满灵气,而不是千篇一概,死气沉沉的代码。