Hibernate的离线查询

在上一篇博客中介绍了Hibernate的查询方式,本文着重介绍Hibernate的离线查询。

首先弄明白DetachedCriteria是什么,它和Criteria有什么区别。

      Criteria和DetachedCriteria的主要区别在于创建的形式不一样,Criteria是在线的,所以它是由Hibernate Session进行创建的;而DetachedCriteria是离线的,创建时无需Session,它通过2个静态方法forClass(查询对象的Class) 或 forEntityName(Name) 进行DetachedCriteria 的实例创建。(Spring的框架提供了getHibernateTemplate ().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria来返回查询结果)所以它也称为离线条件查询,即建立一个DetachedCriteria对象,将查询的条件等指定好,然后在session.beginTransaction()后将这个对象传入。通常这个对象可以在表示层建立,然后传入业务层进行查询。

Criteria和DetachedCriteria均可使用Criterion和Projection设置查询条件。

对于Criterion和Criteria:

Criterion 是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来添加查询条件。

Criterion 的实例可以通过 Restrictions 工具类来创建,Restrictions 提供了大量的静态
方法,如 eq (等于)、 ge (大于等于)、 between 等来方法的创建 Criterion 查询条件
(Simpleexpression_r 实例).

// 创建DetachedCriteria对象  
DetachedCriteria query = DetachedCriteria.forClass(Employee.class).add( Property.forName("sex").eq('0') );  
// 获取Session对象  
Session session = ....;  
// 开启事务  
Transaction txn = session.beginTransaction();  
// 将DetachedCriteria查询对象与可执行的Criteria实例关联起来  
List results = query.getExecutableCriteria(session).setMaxResults(150).list();  
// 提交事务  
txn.commit();  
// 关闭Session,释放资源  
session.close();  

DetachedCriteria可用作子查询

// 构建所有Employee中的平均年龄 
DetachedCriteria avgAge = DetachedCriteria.forClass(Employee.class)  
        .setProjection(Property.forName("age").avg());  
// 获取所有Employee中,高于平均提供的Employee的集合  
session.createCriteria(Employee.class).add(Property.forName("age").gt(avgAge ))  
        .list();  

使用getHibernatTemplate模板

DetachedCriteria dc = DetachedCriteria.forClass(User.class);
		dc.add(Restrictions.eq("id", 6));
		List<User> list = (List<User>) getHibernateTemplate().findByCriteria(dc);
		if(list!=null && list.size()>0) {
			return list.get(0);
		}else {
			return null;
		}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值