技术开发 频道

NHibernate Step by Step (五)Criteria Query

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

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")

 

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          
=
 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对象,然后填充其属性即可,不用再去构造那丑陋的条件判断语句了!

0
相关文章