普通的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
分享到:
相关推荐
DetachedCriteria的查询方式汇总
DetachedCriteria
DetachedCriteria使用介绍
NULL 博文链接:https://chaoyi.iteye.com/blog/2152094
Hibernate - DetachedCriteria 的完整用法文档描述
DetachedCriteria Criteria 使用方法 非常详细外加练习
NULL 博文链接:https://rmn190.iteye.com/blog/379302
下面小编就为大家带来一篇浅谈DetachedCriteria和Criteria的使用方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
源文件 博文链接:https://kings008.iteye.com/blog/246773
().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结 果。 DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name) 进行DetachedCriteria 实例的创建。
使用 Hibernate Criteria && DetachedCriteria Queries演示Exists Clause非常简单的项目 安装 git clone https://github.com/RameshRM/hibernate-sample.git 跑步 mvn install 这是一个maven项目,依赖项是 ...