`
javatoyou
  • 浏览: 1084906 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

NHibernate Step by Step (五)Criteria Query

 
阅读更多

NHibernate Step by Step ()Criteria Query

可能很多人象我一样,刚开始接触HQL时,脑袋一片混沌,这是什么语法嘛!!之所以这样,是因为我们总是会先入为主地将之与SQL想比,虽然HQL看起来很SQL,而且设计时就有这样的意图,但是毕竟是两种差别很大的东西,难免就会出现理解偏差的问题。好了,我们今天就不让大家脑袋发晕了,HQL我们暂时放一放。今天我们来说另外一种查询方法:

Criteria Query.

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

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

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

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

IListlist
=criteria.List();

注意这一句:

Expression.Eq("Name","JackieChan")

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

对应HQL就是:

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

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

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

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

Eq=Equal
Gt
=Greaterthan
Lt
=Lessthan
Like
=Like
Not
=Not
IsNull
=IsNull


基本上对应了大部分

HQL的语义,详细的说明请参考api

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

1. Example查询

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

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

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

if(txtSex.Text!=null)
condition
+=“andSex=+txtSex.Text;

……


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

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


ICriteriacriteria=session.CreateCriteria(typeof(Person));

Personperson
=newPerson();
person.Name
="JackieChan";
person.Age
=50;

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

请注意:

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

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

SELECTthis.idasid0_,this.nameasname0_,this.ageasage0_FROMPersonthisWHERE(this.age=@p0)

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

2. 排序

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

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

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

IListlist
=criteria.List();

请注意:

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

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

SELECTthis.idasid0_,this.nameasname0_,this.ageasage0_FROMPersonthisWHEREthis.age>@p0ORDERBYthis.ageasc

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

3. 限制记录范围

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

如下代码:

ICriteriacriteria=session.CreateCriteria(typeof(Person));

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

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

IListlist
=criteria.List();

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

注意:

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

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


好了,这一篇就讲这么多,我们下次再接着练习。
任何建议或者批评,请eabluedog@163.com

分享到:
评论

相关推荐

    NHibernate Step by Step入门教程

    7. **查询**:NHibernate提供了HQL(Hibernate Query Language)和Criteria API两种方式来执行查询,HQL类似SQL但面向对象,Criteria API则允许动态构建查询。 8. **事务管理**:NHibernate支持.NET的...

    NHibernate Step by Step(教程).doc

    ### NHibernate Step by Step 教程知识点概览 #### 一、环境搭建与配置 - **NHibernate**:NHibernate 是一个开源的对象关系映射器(Object-Relational Mapper,ORM),它允许开发者以面向对象的方式操作关系型...

    Linq2NHibernate.Step1

    《LINQ to NHibernate入门教程》 在.NET框架中,LINQ(Language Integrated Query,语言集成查询)是一种强大的查询工具,它允许开发者使用C#或VB.NET等编程语言的语法来执行数据库查询。而在ORM(对象关系映射)...

    Nhibernate Query Analyzer-开源

    **Nhibernate Query Analyzer 开源详解** 在.NET开发领域,ORM(对象关系映射)框架如NHibernate,极大地简化了数据库操作。然而,当处理复杂的查询时,开发者可能会遇到性能问题,这时就轮到NHibernate Query ...

    NHibernate-2.1.2.GA-bin NHibernate框架

    3. **查询语言**:NHibernate 支持 HQL(NHibernate Query Language),一种面向对象的查询语言,以及 Criteria 查询,这两种方式都允许开发者以更接近于面向对象的方式检索数据,而非传统的 SQL。 4. **事件和拦截...

    NHibernate

    4. **Querying**: 提供多种查询方式,如HQL(Hibernate Query Language)、Criteria API、Linq-to-NHibernate等。 5. **Transaction Management**: 处理事务,确保数据的一致性和完整性。 **开始使用NHibernate** ...

    nhibernate

    nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#

    [全套更新完毕北风网--牛牛讲师Nhibernate专题讲座之NHibernate的五部曲(共4课时)].NHibernate01.rar

    《牛牛讲师Nhibernate专题讲座之NHibernate的五部曲》是针对数据库持久化框架NHibernate的一次深入讲解,共分为四课时。这个压缩包包含了一系列的学习资源,帮助用户全面理解并掌握NHibernate的核心概念和技术。下面...

    NHibernate应用讲解.pdf

    #### 五、条件查询(CriteriaQuery) - **定义**: Criteria API允许开发人员以编程方式构建复杂的查询条件。 - **特点**: - 更灵活,支持动态构造查询条件。 - 支持复杂的查询逻辑。 - **实例**: - 查询所有年龄...

    Nhibernate

    5. **查询API**:Nhibernate提供了HQL(Hibernate Query Language)和 Criteria API,它们是面向对象的查询方式,用于检索数据。 6. **事务(Transactions)**:Nhibernate支持事务管理,确保数据的一致性和完整性...

    NHibernate_Demo

    7. **Criteria查询和HQL**:NHibernate提供了两种查询方式:Criteria API和HQL(Hibernate Query Language)。Criteria API允许开发者以对象方式构建查询,而HQL是一种面向对象的查询语言,类似于SQL但更贴近面向...

    NHibernate2.0中文文档

    6. **查询**:探索HQL(Hibernate Query Language)和 Criteria API,它们是NHibernate提供的面向对象的查询方式,可以替代SQL。 7. **性能优化**:了解如何通过缓存策略、延迟加载和批处理等手段提高NHibernate的...

    NHibernate 3.2实例

    - NHibernate提供了HQL(Hibernate Query Language)和 Criteria 查询,以及Linq to NHibernate。 - HQL是一种面向对象的查询语言,类似SQL,但操作的是对象和类。 - Criteria查询是一种基于对象的API,可以动态...

    学习经典NHibernate框架

    3. **Querying**:NHibernate提供了多种查询方式,包括HQL(Hibernate Query Language)、 Criteria API 和 LINQ。HQL类似于SQL,但它是面向对象的,可以直接操作对象而非表格。Criteria API则提供了一种更加面向...

    NHibernate实例

    NHibernate提供多种查询方式:HQL(Hibernate Query Language)、Criteria API 和 LINQ。HQL 类似于 SQL,但面向对象;Criteria API 允许动态构建查询;LINQ 提供更贴近 C# 的查询语法。`ISession.Query()`或`...

    NHibernate2.0

    - NHibernate 2.0 使用Hibernate Mapping By Code或HBM XML文件来定义对象与数据库表之间的映射关系。这些文件定义了类、属性、标识符、关联等元素的映射规则。 **3. Session和Transaction管理** - Session是...

Global site tag (gtag.js) - Google Analytics