Criteria的完整用法.pdf
### Criteria的完整用法详解 #### 一、概述 在基于Spring和Hibernate的项目开发中,Criteria API提供了灵活且强大的查询功能,使开发者能够轻松构建复杂的查询条件,从而提高数据检索的效率与精确度。本文将深入探讨Hibernate中Criteria API的全面应用,包括其结构、特性以及实际操作技巧。 #### 二、核心概念解析 ##### 1. Criteria与DetachedCriteria - **Criteria**:由`Session`在线创建,用于执行即时查询。它紧密依赖于当前的`Session`状态,适用于查询过程中动态调整条件的场景。 - **DetachedCriteria**:为离线创建,不依赖于`Session`。这使得开发者可以在任何地方预定义查询条件,之后再将这些条件应用于`Session`中执行查询,增加了代码的可读性和复用性。`DetachedCriteria`通过`forClass(Class)`或`forEntityName(String)`方法创建实例。 ##### 2. Criterion与Projection - **Criterion**:表示查询中的条件,是`Criteria`的基础元素。`Restrictions`工具类提供了丰富的静态方法(如`eq`、`gt`、`like`等)用于创建不同类型的`Criterion`实例。 - **Example**:一种特殊的`Criterion`,允许通过实体对象实例化,实现基于对象的查询。支持忽略大小写、模糊匹配等特性。 - **Projection**:用于聚合查询和分组,例如计算平均值、最大值等。`Projections`类提供了创建`Projection`的便捷方法,如`avg`、`count`、`max`等。 ##### 3. Query条件组装 - **FetchMode**:控制Hibernate如何加载关联对象,如EAGER(急切加载)和LAZY(延迟加载),影响查询性能和资源消耗。 - **Sort Order**:设置查询结果的排序方式,通过`Criteria`的`addOrder(Order)`方法实现。 - **FlushMode**:`Criteria`还允许设置`FlushMode`,控制何时将缓冲区中的更改同步到数据库,影响事务管理。 #### 三、实战案例 1. **创建Criteria实例** ```java Session session = HibernateUtil.getSessionFactory().openSession(); Criteria criteria = session.createCriteria(Cat.class); criteria.setMaxResults(50); List<Cat> cats = criteria.list(); ``` 2. **设置查询条件** - 使用`Restrictions.eq`方法精确匹配: ```java criteria.add(Restrictions.eq("age", 3)); ``` - 模糊匹配字符串: ```java criteria.add(Restrictions.like("name", "%Tom%")); ``` - 聚合查询: ```java criteria.setProjection(Projections.count("id")); ``` 3. **利用DetachedCriteria** ```java DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Cat.class); detachedCriteria.add(Restrictions.eq("color", "white")); List<Cat> whiteCats = getHibernateTemplate().findByCriteria(detachedCriteria); ``` #### 四、小结 Hibernate的Criteria API通过其丰富的特性和灵活性,为开发者提供了构建复杂查询的强大工具。通过理解并熟练掌握`Criteria`、`DetachedCriteria`、`Criterion`和`Projection`等核心概念及其使用方法,可以显著提升数据库操作的效率和代码的可维护性。在实际项目中,结合Spring框架的便利性,开发者能够更加专注于业务逻辑的实现,而无需过多担忧底层的数据访问细节。