普通的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 是 Hibernate 中的一种离线查询对象,它可以在不依赖 Session 的情况下生成动态 SQL 语句并进行查询。下面是 DetachedCriteria 查询的详细知识点: 创建 DetachedCriteria...
在DetachedCriteria中定义的查询条件可以在稍后的时间点附加到Session上执行,这使得查询可以脱离当前的Session状态,因此得名“Detached”。这种特性在处理复杂的、跨多个事务的查询时非常有用,同时也可以避免因长...
使用 DetachedCriteria 可以很方便地根据查询条件来返回查询结果,Spring 框架提供了 `getHibernateTemplate().findByCriteria(detachedCriteria)` 方法来实现这一点。 Criteria 和 DetachedCriteria 均可使用 ...
条件查询** - **多条件的 and 规则**:默认情况下,多次添加的条件会按照 AND 连接。例如,使用 `searDc.add(Restrictions.eq("unid", userid))` 添加多个条件时,这些条件将以 AND 规则连接在一起。 - **多条件...
在Java的持久化框架Hibernate中,DetachedCriteria是一个强大的查询工具,它允许我们在不与Session交互的情况下构建查询条件。然而,DetachedCriteria在处理复杂的关联查询,尤其是涉及到表连接(JOIN)时,可能存在...
- **使用场景**:`Criteria` 适用于即时查询,而 `DetachedCriteria` 更适合跨层传递查询条件。 - **灵活性**:`DetachedCriteria` 提供了更大的灵活性,可以在不同层之间传递而不会丢失查询状态。 #### 三、`...
在Web编程中,DetachedCriteria和Criteria可以解决动态条件查询的问题,提高程序的灵活性和可维护性。 DetachedCriteria的使用方法: DetachedCriteria是离线的查询工具,可以在Web层构造查询条件,然后将其传递给...
本篇文章将深入探讨Hibernate中的QBC(Query By Example)条件查询与传统的HQL(Hibernate Query Language)查询的对比,帮助开发者更好地理解和选择适合的查询方式。 QBC(Query By Example)是Hibernate提供的一...
10. **使用DetachedCriteria**:当查询条件在未来的某个时刻才确定时,可以先创建一个DetachedCriteria对象,然后在需要的时候再与Session关联并执行查询。 在实际开发中,Hibernate Criteria查询提供了很大的便利...
在这个“springMVC+hibernate的条件查询加分页的demo”中,我们将探讨如何结合这两个框架实现动态的条件查询和分页功能。 首先,让我们了解一下SpringMVC中的条件查询。在SpringMVC中,通常通过Controller层接收...
DetachedCriteria是Criteria API的一个扩展,它允许在业务层创建查询条件,并在数据访问层执行查询。 **特点:** - **面向对象:** 继承了Criteria API的所有优点。 - **业务逻辑分离:** 可以将查询条件的构建与...
《Hibernate查询条件查询详解》 Hibernate作为Java领域中广受欢迎的对象关系映射(ORM)框架,极大地简化了数据库操作。其强大的查询能力是其核心功能之一。本篇将深入探讨Hibernate的条件查询,帮助开发者更好地...
QBC提供了一种面向对象的方式来构建查询条件,与SQL语句相比,它更易于理解和维护,尤其在处理复杂的查询逻辑时。在本资料中,我们深入探讨QBC的各种查询技术及其在MVC架构下的应用。 首先,我们要理解QBC的基本...
在上述代码中,我们创建了一个DetachedCriteria对象,设置了查询条件为用户名等于"admin",然后在主查询中添加了这个子查询条件。 Criterion查询还可以与Projection一起使用,实现分组、聚合等功能。Projection是...
这里首先创建了一个`DetachedCriteria`对象,并添加了相应的查询条件。然后通过`getExecutableCriteria`方法获取一个可执行的`Criteria`对象,并执行查询。 #### 4. Example `Example`是另一种用于查询的方式,...
Criteria 和 DetachedCriteria 都可以使用Criterion 和 Projection 设置查询条件,可以设置 FetchMode(联合查询抓取的模式)、设置排序方式,对于 Criteria 还可以设置 FlushMode(冲刷 Session 的方式)和 ...
Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode(联合查询抓取的模式),设置排序方式。对于 Criteria 还可以设置 FlushModel(冲刷 Session 的方式)和 ...
如果你希望在不打开Session的情况下构建查询条件,可以使用DetachedCriteria: ```java DetachedCriteria detached = DetachedCriteria.forClass(User.class); detached.setProjection(Projections.property(...
- **基本操作**:Criteria查询可以通过DetachedCriteria创建,然后添加各种限制条件,如Restrictions.eq()用于等于,gt()用于大于等。还可以通过Projections获取特定的查询结果,如sum()、count()等。Order类用于...
HQL适用于简单的查询,Criteria API和DetachedCriteria适合构建复杂条件,Native SQL则在处理特定数据库功能时不可或缺。理解并熟练掌握这些查询方法,将有助于提高Java应用的数据访问效率和代码质量。