目录

写在前面

文档与系列文章

条件查询

一个例子

总结

写在前面

上篇文章介绍了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条客户信息的集合。

         /// <summary>
/// 通过条件查询Criteria查询顾客信息
/// </summary>
/// <returns></returns>
public IList<Customer> GetCustomers()
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
//获得ISession实例
ISession session = nhibernateHelper.GetSession();
//通过ISession创建ICriteria实例
ICriteria criteria = session.CreateCriteria(typeof(Customer));
// Set a limit upon the number of objects to be retrieved
//汉:设置最大的检索对象个数
criteria.SetMaxResults();
return criteria.List<Customer>();
}

使用条件查询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;
         /// <summary>
/// 通过条件查询Criteria查询顾客信息
/// </summary>
/// <returns></returns>
public IList<Customer> GetCustomers()
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
//获得ISession实例
ISession session = nhibernateHelper.GetSession();
//通过ISession创建ICriteria实例
ICriteria criteria = session.CreateCriteria(typeof(Customer));
//查询名字以w开头的客户信息。
criteria.Add(Restrictions.Like("CustomerName", "w%"));
//另一种方式
criteria.Add(Restrictions.Like("CustomerName", "w", MatchMode.Start));
//查询名字在wolfy和zhangsan内的客户信息
criteria.Add(Restrictions.In("CustomerName", new string[] { "zhangsan", "wolfy" }));
//查询名称不为null的客户信息
criteria.Add(Restrictions.IsNotNull("CustomerName"));
//查询名称等于wolfy的客户
criteria.Add(Restrictions.Eq("CustomerName", "wolfy"));
//查地址是北京海淀区 并且名字为wolfy的客户
criteria.Add(Restrictions.And(Restrictions.Like("CustomerAddress", "北京%"), Restrictions.Eq("CustomerName", "wolfy")));
//按照名字升序排列
criteria.AddOrder(NHibernate.Criterion.Order.Asc("CustomerName"));
return criteria.List<Customer>();
}

看一下生成的sql是什么?

总结

同样在Criteria 查询中使用FetchMode来实现连接限制,这里就不再举例了,感兴趣的可以自己试一试。

说实话,在项目中从没发现使用条件查询的地方,一些查询的方法都是千篇一律的,时间久了,绝对会腻了。如过你在项目中采用了该种方式,是不是瞬间觉得高大上了?我还是引用自己在前面说过的那句话,实现一个业务有A,B,C三种方式,而A是你经常用的,闭着眼都能把每个单词背出来了,你还在用,为啥不尝试一下B和c两种方式。

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

[NHibernate]条件查询Criteria Query的更多相关文章

  1. [转]NHibernate之旅(4):探索查询之条件查询(Criteria Query)

    本节内容 NHibernate中的查询方法 条件查询(Criteria Query) 1.创建ICriteria实例 2.结果集限制 3.结果集排序 4.一些说明 根据示例查询(Query By Ex ...

  2. nhibernate教程(4)--条件查询(Criteria Query)

    NHibernate之旅(4):探索查询之条件查询(Criteria Query) 2008-10-16 18:20 by 李永京, 44341 阅读, 43 评论, 收藏,  编辑 本节内容 NHi ...

  3. Hibernate动态条件查询(Criteria Query)

    1.创建一个Criteria实例net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询.Session是用来制造Criteria实例的工厂. Criteria cri ...

  4. NHibernate初学三之条件查询(Criteria Queries)与AspNetPager分页实例

    NHibernate除了SQL与HQL两种查询操作外,还有一种就是条件查询Criteria,本文将从网上整理一些Criteria的理论及小实例,最后通过一个结合AspNetPager分页来加深理解,必 ...

  5. 条件查询Criteria

    public User getUserByNameCri(String name){ Session session = null; User user = null; try { session = ...

  6. Hibernate QBC 条件查询(Criteria Queries) and Demos

    目录 创建一个Criteria 实例 限制结果集内容 结果集排序 关联 动态关联抓取 查询示例 投影Projections聚合aggregation和分组grouping 离线detached查询和子 ...

  7. NHibernate系列学习(三)-条件查询Criteria

    1.本笔记主要介绍Criteria的使用 2.效果界面 3.代码详情 namespace KimismeDemo { public partial class Form3 : Form { priva ...

  8. NHibernate - ICriteria 查询

    http://blog.knowsky.com/213234.htm http://blog.chinaunix.net/uid-20463341-id-1673509.html http://www ...

  9. hibernate Criteria(条件查询接口)

    Criteria(条件查询接口) // 1.简单查询 List<Customer> list = session.createCriteria(Customer.class).list() ...

随机推荐

  1. Json解析工具Jackson(简单应用)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 概述 Jackson库(http://jackson.codehaus.org),是 ...

  2. 代码提交时让svn忽略classpath、target、.project等

    在用eclipse操作时,经常用到svn的与资源同步这个操作,但是打开的时候会有很多生成的class文件,其实这些并不需要提交的,因为svn原则上是用来管理源代码的.每次资源同步时看到很多class文 ...

  3. 编程中Foo, Bar 到底什么意思?

    1 前言 在很多国外计算机书本和一些第三份开源软件的Demo中经常用到两个英文单词Foo,Bar.这到底是什么意思呢?从步入屌丝界的IT生活见到这两个单词到现在我还是不知道这两个单词的真正含义,今天有 ...

  4. 手把手教你玩GDB

    第一部分牛刀小试:启动GDB开始调试 1.       编译带调试信息的可执行程序:用gcc(g++)编译的时候带上-g选项即可 2.       启动GDB开始调试 (1)gdb program   ...

  5. iOS与Html5和JS之间的交互---学习笔记五

    首先采用的框架是WebViewJavascriptBridge,采用这套框架可以方便的使iOS与JS交互 一. 流程图(主要介绍思路) 二.iOS端如何使用 首先导入#import "Web ...

  6. LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别

    LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别 在写LINQ语句的时候,往往会看到.AsEnumerable() 和 .AsQueryable() .例如: s ...

  7. (转载)SQL删除重复数据方法

    本文转载自http://www.cnblogs.com/sunxiaonan/archive/2009/11/24/1609439.html 例如: id           name         ...

  8. Win7下mysql root账户登录提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)解决方案

    ERROR 1045 (28000): Ac-- password: YES)这个意思是密码不正确,那就修改密码: 如果你是服务器是 windows xp/2000/2003/nt 都可以使用这个方法 ...

  9. 我也来写:数据库访问类DBHelper

    一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...

  10. RapidJSON 代码剖析(二):使用 SSE4.2 优化字符串扫描

    现在的 CPU 都提供了单指令流多数据流(single instruction multiple data, SIMD)指令集.最常见的是用于大量的浮点数计算,但其实也可以用在文字处理方面. 其中,S ...