首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

hibernate入门系列: 应用Criteria载入对象

2012-11-08 
hibernate入门系列: 使用Criteria载入对象nh会话提供一种使用表达式(就像SQL语句的where表达式)来载入数据

hibernate入门系列: 使用Criteria载入对象

nh会话提供一种使用表达式(就像SQL语句的where表达式)来载入数据的方法,?以取得满足条件的对象集合。

通过 CreateCriteria方法,?可以取得一个ICriteria接口,?这个接口用于操作表达式和排序字段.?由CriteriaImpl类实现, 此类加有Internal修饰,因此不能在程序集外显示创建,?CreateCriteria方法需要一个要加载对象类型的参数.

这里列出ICriteria接口中的一些常用方法:

Add:加入条件表达式(Expression对象),此方法可多次调用以组合多个条件;
AddOrder:加入排序的字段(Order对象);
List:执行查询,?返回满足条件的对象集合。
SetMaxResults:设置返回的最大结果数,可用于分页;
SetFirstResult:设置首个对象返回的位置,可用于分页;
SetTimeout:设置操作的超时值,此值将传递给IDbCommand对象;



Expression类是所有表达式类的祖先.?这是一个抽象(abstract)类,?同时也是一个类工厂(Factory?Method模式),?用于创建派生的表达式对象,?用意是很明显的,?隐藏了派生类的细节,使我们可通过一致的方法来创建表达式对象.

下面列出一些Expression中常用的方法:

Eq:得到一个相等判断的表达式,?等同于?propertyName?=?value;
Gt:得到一个大于判断的表达式,?等同于?propertyName?>?value;?
Like:得到一个相似判断的表达式,?等同于?propertyName?like?value;?
And:得到两个表达式And操作后的表达式,?等同于?expression1?and?expression2;?
Or:重到两个表达式Or操作后的表达式,?等同于?expression1?or?expression2;

更多的Expression请参考相关文档或源代码。

Order(排序)

Order类用于向ICriteria接口提供排序信息.?这个类提供了两个静态方法,?分别是Asc和Desc,?顾名思义就是创建升序和降序的Order对象.
例如要取得一个按更新日期(Updated)降序的Order对象,?使用Order.Desc("Updated")就可以了.

示例

下面以几个例子来说明使用Criteria载入对象的用法:

1.?取得用户名(Username)为billy的用户对象:

sql 代码?
  1. Expression?ex?=?Expression.Eq(?"Username",?"billy"?);?//?(?Username?=?'billy'?)??IList?users?=?session.CreateCriteria(typeof(User)).Add(?ex?).List();??



2。取得用户名(Username)为billy,?密码(Password)为123456的用户对象

sql 代码?
  1. Expression?ex?=?Expression.And(???????Expression.Eq("Username",?"billy"),??
  2. ????Expression.Eq("Password",?"123456")??);?//?(?Username='billy'?and?Password='123456'?)???
  3. IList?users?=?session.CreateCriteria(type(User)).Add(?ex?).List();??



3.?取得数据中第20-40的用户对象。

sql 代码?
  1. ICriteria?c?=?session.CreateCriteria(typeof(User));??IList?users?=?c.SetFirstResult(20).SetMaxResults(20).List();???



???对于SQLSERVER,数据定位采用的是IDataReader前滚至firstResult处,然后取maxResults条记录.

4.?取得按注册日期(Regdate)降序排序后的用户对象.

sql 代码?
  1. ICriteria?c?=?session.CreateCriteria(typeof(User));??IList?users?=?c.AddOrder(?Order.Desc("Regdate")?).List();???



使用Criteria加载数据的不足:

1.?当使用SetFirstResult和SetMaxResults限制返回的对象数时,无法得知对象的总数;
2.?当前版本不支持关联查询(hibernate好像可以);

热点排行