• NHibernateCriteria Query


    Criteria Query.

    什么是Criteria Query?简单说,就是将我们的查询条件封装为一个预定义的查询对象,由这个查询对象来执行查询,而不用我们再去写HQL了,而且更接近我们贯常的编程习惯。

    是不是很不错?让我们来look look:

    //创建关联到某个类的查询对象
    ICriteria criteria = session.CreateCriteria(typeof(Person));

    //添加表达式
    criteria.Add(Expression.Eq("Name","Jackie Chan"));

    IList list = criteria.List();

    注意这一句:

    Expression.Eq("Name","Jackie Chan")

    Eq是Equal的缩写,意思是添加一个查询表达式,Person.Name = “Jackie Chan”

    对应HQL就是:

    from Person p where p.Name=”Jackie Chan”

    NHibernate会在运行时动态生成类似上面的HQL,我们可以在配置文件把show-sql打开,观看生成的SQL。

    这样是不是感觉清晰多了?又回到我们以前的编码习惯了!

    为了对应HQL的种种查询条件,NHibernate预定义了大量的Expression方法,我们列几个如下:

    Eq          = Equal
    Gt          = Greater than
    Lt          = Less than
    Like        = Like
    Not         = Not
    IsNull      = Is Null


    基本上对应了大部分HQL的语义,详细的说明请参考api。

    下面,我们详细介绍Criteria的用法。

    1.  Example查询

    我们常常有这样的查询页面:

    用户可以输入“姓名”、“性别”、“年龄”等等来进行查询,而我们常常的做法就是如下的烦琐:

    string condition = “”;
    if(txtName.Text != null)
            condition += “ Name=” + txtName.Text;

    if(txtSex.Text != null)
           condition += “ and Sex=” + txtSex.Text;

    ……


    代码看起来实在是不甚美观,有什么解决办法呢?

    Criteria提供了专为这种问题而设计的Example查询,如下:

    ICriteria criteria = session.CreateCriteria(typeof(Person));

    Person person = new Person();
    person.Name = "Jackie Chan";
    person.Age = 50;

    //创建一个Example对象
    criteria.Add(Example.Create(person));
    IList list = criteria.List();

    请注意:

    criteria.Add(Example.Create(person));

    这句代码的意思是通过构造的person对象的属性来生成表达式,实际生成的代码如下:

    SELECT this.id as id0_, this.name as name0_, this.age as age0_ FROM Person this WHERE (this.age = @p0)

    对应上面的问题,我们简单地new出一个person对象,然后填充其属性即可,不用再去构造那丑陋的条件判断语句了!

    2.  排序

    我们想对返回的list进行排序,该怎么办呢?如下:

    ICriteria criteria = session.CreateCriteria(typeof(Person));
    criteria.Add(Expression.Gt("Age", 20)); 

    //添加一个排序对象
    criteria.AddOrder(Order.Asc("Age"));

    IList list = criteria.List();

    请注意:

    criteria.AddOrder(Order.Asc("Age"));

    这句代码的意思是在criteria上构造一个排序对象,并以Age属性做正序排列,NHibernate在运行时会生成如下语句:

    SELECT this.id as id0_, this.name as name0_, this.age as age0_ FROM Person this WHERE this.age > @p0 ORDER BY this.age asc

    如你所猜想,Order类肯定有另外一个“Desc“方法:)

    3.  限制记录范围

    在显示大量的记录时,我们常常采用的方法就是分页,如果用NHibernate来做,该怎么办呢?

    如下代码:

    ICriteria criteria = session.CreateCriteria(typeof(Person));

    //从第10条记录开始取
    criteria.SetFirstResult(10);

    //取20条记录
    criteria.SetMaxResults(20);

    IList list = criteria.List();

    这样,我们就达到了分页的目的。

    注意:

    NHibernate的分页机制实际上依赖于不同的数据库实现,所以,对特定的某种数据库,并不一定是效率最好的,比如对SQLServer(为什么受伤的总是俺?为什么总是说俺比不上Oracle?俺都赶在2005年年底出2005版本了!!)。想知道为什么吗?很简单,check一下上面代码生成的SQL就清楚了!或者深入点再看看NHibernate的分页代码,我就不解释了,自己动手,丰衣足食:)

    总体来讲,Criteria对我们来说更熟悉,更容易上手,但是目前Criteria还是不够完善——将对应的HQL一一封装实在太烦琐了,所以NHibernate还是以HQL查询为主,我们在使用的时候则看需要了,要么使用HQL,要么HQL和Criteria混合使用,重要的是解决问题.

  • 相关阅读:
    前端基础 — BOM和DOM
    JavaScript概述
    前端知识 — HTML内容、CSS基础
    数据库MySQL
    jquery ajax() 方法使用
    移动端自适应的问题及解决
    jquery appendTo 和 append 的用法
    css 截取文字
    电脑模拟手机工具
    jquery 旋转插件jqueryrotate
  • 原文地址:https://www.cnblogs.com/cw_volcano/p/2307556.html
Copyright © 2020-2023  润新知