条件查询DetachedCriteria

普通的DAO类只能用于简单的crud,一旦查询业务复杂后,就可以用Hibernate跟我们提供的工具类DetachedCriteria来解决复杂的关联动态查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查询。在分层应用程序来中,Web层需要传递一个查询的条件列表给业务层对象,业务层对象获得这个条件列表之后,然后依次取出条件,构造查询语句。
DetachedCriteria是这样一个类,它实现了Serializable接口,Serializable接口是一个封装了复杂数据类型的接口,它实现了对实体对象的基本操作,DetachedCriteria实现机制大概是这样的:在web层,程序员使用DetachedCriteria来构造查询条件,然后将这个DetachedCriteria作为方法调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后,可以在session范围内直接构造Criteria,进行查询。就此,查询语句的构造完全被搬离到web层实现,而业务层则只负责完成持久化和查询的封装即可,与查询条件构造完全解耦,

例如判断两个实体对象是否相等,示例代码如下:
web层程序构造查询条件:
DetachedCriteria dc = null;	public QueryBuilder eq(String propertyName, Object value) {
if (isNotEmpty(value)) {
dc.add(Restrictions.eq(propertyName, value));
}
return this;
}

业务层对象使用该条件执行查询:


detachedCriteria.getExecutableCriteria(session).list(); 


业务层代码是固定不变的,所有查询条件的构造都在web层完成,业务层只负责在session内执行之。这样代码就可放之四海而皆准,都无须修改了。

Spring的HibernateTemplate提供了Hibernate的完美封装,即通过匿名类实现回调,来保证Session的自动资源管理和事务的管理。其中核心方法是:

HibernateTemplate.execute(new HibernateCallback() { 
 public Object doInHibernate(Session session) throws HibernateException {
  ....
 }
}

业务层代码使用spring,HibernateTemplate内部类的findByCriteria如下:
public List findByCriteria(final DetachedCriteria criteria, final int firstResult, final int maxResults)
throws DataAccessException {

Assert.notNull(criteria, "DetachedCriteria must not be null");
return (List) executeWithNativeSession(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria executableCriteria = criteria.getExecutableCriteria(session);
prepareCriteria(executableCriteria);
if (firstResult >= 0) {
executableCriteria.setFirstResult(firstResult);
}
if (maxResults > 0) {
executableCriteria.setMaxResults(maxResults);
}
return executableCriteria.list();
}
});
}

实际上也就是:

Criteria criteria = detachedCriteria.getExecutableCriteria(session); 
return criteria.list();


而已

本文参考天极网原作者robbin的Hibernate3的DetachedCriteria支持
原文地址:http://dev.yesky.com/241/2033241.shtml
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值