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")
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=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,要么HQL和Criteria混合使用,重要的是解决问题,对不?
好了,这一篇就讲这么多,我们下次再接着练习。
任何建议或者批评,请e:abluedog@163.com
分享到:
相关推荐
7. **查询**:NHibernate提供了HQL(Hibernate Query Language)和Criteria API两种方式来执行查询,HQL类似SQL但面向对象,Criteria API则允许动态构建查询。 8. **事务管理**:NHibernate支持.NET的...
### NHibernate Step by Step 教程知识点概览 #### 一、环境搭建与配置 - **NHibernate**:NHibernate 是一个开源的对象关系映射器(Object-Relational Mapper,ORM),它允许开发者以面向对象的方式操作关系型...
《LINQ to NHibernate入门教程》 在.NET框架中,LINQ(Language Integrated Query,语言集成查询)是一种强大的查询工具,它允许开发者使用C#或VB.NET等编程语言的语法来执行数据库查询。而在ORM(对象关系映射)...
**Nhibernate Query Analyzer 开源详解** 在.NET开发领域,ORM(对象关系映射)框架如NHibernate,极大地简化了数据库操作。然而,当处理复杂的查询时,开发者可能会遇到性能问题,这时就轮到NHibernate Query ...
3. **查询语言**:NHibernate 支持 HQL(NHibernate Query Language),一种面向对象的查询语言,以及 Criteria 查询,这两种方式都允许开发者以更接近于面向对象的方式检索数据,而非传统的 SQL。 4. **事件和拦截...
4. **Querying**: 提供多种查询方式,如HQL(Hibernate Query Language)、Criteria API、Linq-to-NHibernate等。 5. **Transaction Management**: 处理事务,确保数据的一致性和完整性。 **开始使用NHibernate** ...
nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#
《牛牛讲师Nhibernate专题讲座之NHibernate的五部曲》是针对数据库持久化框架NHibernate的一次深入讲解,共分为四课时。这个压缩包包含了一系列的学习资源,帮助用户全面理解并掌握NHibernate的核心概念和技术。下面...
#### 五、条件查询(CriteriaQuery) - **定义**: Criteria API允许开发人员以编程方式构建复杂的查询条件。 - **特点**: - 更灵活,支持动态构造查询条件。 - 支持复杂的查询逻辑。 - **实例**: - 查询所有年龄...
5. **查询API**:Nhibernate提供了HQL(Hibernate Query Language)和 Criteria API,它们是面向对象的查询方式,用于检索数据。 6. **事务(Transactions)**:Nhibernate支持事务管理,确保数据的一致性和完整性...
7. **Criteria查询和HQL**:NHibernate提供了两种查询方式:Criteria API和HQL(Hibernate Query Language)。Criteria API允许开发者以对象方式构建查询,而HQL是一种面向对象的查询语言,类似于SQL但更贴近面向...
6. **查询**:探索HQL(Hibernate Query Language)和 Criteria API,它们是NHibernate提供的面向对象的查询方式,可以替代SQL。 7. **性能优化**:了解如何通过缓存策略、延迟加载和批处理等手段提高NHibernate的...
- NHibernate提供了HQL(Hibernate Query Language)和 Criteria 查询,以及Linq to NHibernate。 - HQL是一种面向对象的查询语言,类似SQL,但操作的是对象和类。 - Criteria查询是一种基于对象的API,可以动态...
3. **Querying**:NHibernate提供了多种查询方式,包括HQL(Hibernate Query Language)、 Criteria API 和 LINQ。HQL类似于SQL,但它是面向对象的,可以直接操作对象而非表格。Criteria API则提供了一种更加面向...
NHibernate提供多种查询方式:HQL(Hibernate Query Language)、Criteria API 和 LINQ。HQL 类似于 SQL,但面向对象;Criteria API 允许动态构建查询;LINQ 提供更贴近 C# 的查询语法。`ISession.Query()`或`...
- NHibernate 2.0 使用Hibernate Mapping By Code或HBM XML文件来定义对象与数据库表之间的映射关系。这些文件定义了类、属性、标识符、关联等元素的映射规则。 **3. Session和Transaction管理** - Session是...