Hibernate的Criteria API是一种用于动态构建SQL查询的方法,无需手动编写HQL(Hibernate Query Language)语句。它提供了一种面向对象的方式来构建查询条件,使得代码更加简洁且易于维护。以下是对Criteria用法的详细说明:
1. **创建Criteria实例**:
要开始使用Criteria,你需要在Hibernate的Session中调用`createCriteria()`方法,传入你想查询的实体类的Class对象。例如,如果你要查询Person实体,你会这样做:
```java
Criteria c = session.createCriteria(Person.class);
```
2. **添加查询条件**:
Criteria API提供了`Restrictions`类来构建各种条件。以下是一些常见的条件操作:
- `eq`: 等于,如`Restrictions.eq("age", new Integer(20))`。
- `allEq`: 批量等于,使用Map,例如`Restrictions.allEq(map)`。
- `gt`: 大于,如`Restrictions.gt("age", new Integer(20))`。
- `ge`: 大于等于,如`Restrictions.ge("age", new Integer(20))`。
- `lt`: 小于,如`Restrictions.lt("age", new Integer(20))`。
- `le`: 小于等于,如`Restrictions.le("age", new Integer(20))`。
- `between`: 区间,如`Restrictions.between("age", lowerBound, upperBound)`。
- `like`: 模糊匹配,如`Restrictions.like("name", "%John%")`。
- `in`: 在一组值内,如`Restrictions.in("id", ids)`。
- `and`和`or`: 逻辑与和逻辑或,用于组合多个条件,如`Restrictions.and(cond1, cond2)`和`Restrictions.or(cond1, cond2)`。
3. **关联查询**:
如果需要进行关联查询,例如查询Person与Department的一对多关系,可以通过`createCriteria()`方法创建子Criteria。例如:
```java
List list = c.createCriteria("department")
.add(Restrictions.eq("departmentname", "开发部"))
.list();
```
这将添加一个条件,限制Person实体所在的部门名称为"开发部"。
4. **离线Criteria(DetachedCriteria)**:
Hibernate 3引入了`DetachedCriteria`,它允许你在不直接涉及Session的情况下构建查询条件。这有助于分离业务逻辑和数据访问层,使代码更易管理。创建DetachedCriteria的示例如下:
```java
DetachedCriteria detchedCriteria = DetachedCriteria.forClass(Person.class);
detchedCriteria.add(Restrictions.ge("age", new Integer(25)));
```
当你需要执行查询时,再将DetachedCriteria转换为Criteria并应用于Session:
```java
Criteria attachedCriteria = detchedCriteria.getExecutableCriteria(session);
List<Person> list = attachedCriteria.list();
```
5. **排序和分页**:
Criteria API还支持排序(Order)和分页(Pagination)。例如,你可以使用`addOrder()`方法指定排序方式,`setFirstResult()`和`setMaxResults()`进行分页。
6. **投影(Projection)**:
除了获取整个实体外,还可以使用Criteria进行投影操作,如获取特定属性的列表或计算结果。`Projections`类提供了不同类型的投影方法。
7. **聚合函数**:
你可以使用`Projections`类中的方法,如`count()`、`sum()`、`avg()`、`max()`和`min()`,来执行聚合操作。
8. **子查询**:
Criteria API允许在查询中嵌套子查询,使用`createCriteria()`方法创建子Criteria,并通过`add(Subqueries.propertyIn("property", subquery))`等方式将其与主查询关联。
Hibernate的Criteria API提供了一种灵活、面向对象的查询方式,使得在Java应用中操作数据库变得更加方便。通过组合不同的条件和操作,可以构建出复杂的查询逻辑,同时保持代码的整洁和可读性。