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

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

  • 相关阅读:
    XMPP即时通讯资料记录
    iOS 图片裁剪与修改
    iOS开发xcode报错:"xxxxxx"has been modified since the precompiled header was built
    模糊数学课件(清晰易懂)
    几个可用于数据挖掘和统计分析的java库
    java中list集合的内容,如何使用像数据库中group by形式那样排序
    spark java 代码example
    spark 编程向导
    一个深度学习博客
    Selenium2(WebDriver)_如何判断WebElement元素对象是否存在
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/4046672.html
Copyright © 2020-2023  润新知