【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();
注意这一句:
Eq是Equal的缩写,意思是添加一个查询表达式,Person.Name = “Jackie Chan”
对应HQL就是:
from Person p where p.Name=”Jackie Chan”
NHibernate会在运行时动态生成类似上面的HQL,我们可以在配置文件把show-sql打开,观看生成的SQL。
这样是不是感觉清晰多了?又回到我们以前的编码习惯了!
为了对应HQL的种种查询条件,NHibernate预定义了大量的Expression方法,我们列几个如下:
Gt = Greater than
Lt = Less than
Like = Like
Not = Not
IsNull = Is Null
基本上对应了大部分HQL的语义,详细的说明请参考api。
下面,我们详细介绍Criteria的用法。
1. Example查询
我们常常有这样的查询页面:
用户可以输入“姓名”、“性别”、“年龄”等等来进行查询,而我们常常的做法就是如下的烦琐:
if(txtName.Text != null)
condition += “ Name=” + txtName.Text;
if(txtSex.Text != null)
condition += “ and Sex=” + txtSex.Text;
……
代码看起来实在是不甚美观,有什么解决办法呢?
Criteria提供了专为这种问题而设计的Example查询,如下: 请注意:
Person person = new Person();
person.Name = "Jackie Chan";
person.Age = 50;
//创建一个Example对象
criteria.Add(Example.Create(person));
IList list = criteria.List();
这句代码的意思是通过构造的person对象的属性来生成表达式,实际生成的代码如下:
对应上面的问题,我们简单地new出一个person对象,然后填充其属性即可,不用再去构造那丑陋的条件判断语句了!