条件查询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

你可能感兴趣的:(DAO,spring,sql,Hibernate,Web)