当前位置: 首页 > news >正文

[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两种方式。

通过本篇的学习,我们了解了条件查询,在限制结果集方面做的还是非常好的,提供了常用的限制方法,更接近咱们的思维方式,何不在项目中使用起来,也让咱们的代码充满灵气,而不是千篇一律,死气沉沉的代码。

相关文章:

  • SQL-12 获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary...
  • DataGridView隔行显示不同的颜色
  • 获取随机数,要求长度一致的字符串格式
  • 润乾集算报表多样性数据源之动态源
  • springsecurity 源码解读 之 RememberMeAuthenticationFilter
  • 算法:四舍六入五成双 ,保留三位有效数字
  • VS 编码规范---- 代码注释设置
  • Tuxedo入门学�
  • mybatis的collection查询问题以及使用原生解决方案的结果
  • javaweb_CSS
  • sam哥其实是个安静的美男子...
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 经典面试题1
  • JAVA学习路线 零基础新手必备
  • Flask+jinja2 开发Puppet用户和节点管理系统
  • 2017-08-04 前端日报
  • Android 控件背景颜色处理
  • Android交互
  • conda常用的命令
  • cookie和session
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Meteor的表单提交:Form
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • PHP面试之三:MySQL数据库
  • React+TypeScript入门
  • spring boot 整合mybatis 无法输出sql的问题
  • SQLServer之创建数据库快照
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 电商搜索引擎的架构设计和性能优化
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 复杂数据处理
  • 高性能JavaScript阅读简记(三)
  • 汉诺塔算法
  • 开源SQL-on-Hadoop系统一览
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 排序(1):冒泡排序
  • 小程序开发之路(一)
  • 一天一个设计模式之JS实现——适配器模式
  • 云大使推广中的常见热门问题
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 责任链模式的两种实现
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​iOS实时查看App运行日志
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • (145)光线追踪距离场柔和阴影
  • (pytorch进阶之路)扩散概率模型
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (三)mysql_MYSQL(三)
  • (转)h264中avc和flv数据的解析
  • (转)jQuery 基础
  • (转)ORM
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • **CI中自动类加载的用法总结