1. 概述
在本篇快速教程中,我们将介绍如何使用 Hibernate 通过 JPQL 或 Criteria API 来获取数据库表中的全部数据。
JPQL 提供了一种更简洁直观的实现方式,而 Criteria API 则更加灵活、动态,适合构建复杂的查询逻辑。
2. JPQL
JPQL 是一种面向对象的查询语言,它提供了一种简单直接的方式来获取表中所有实体。
来看一个使用 JPQL 查询所有学生(Student)的例子:
public List<Student> findAllStudentsWithJpql() {
return session.createQuery("SELECT a FROM Student a", Student.class).getResultList();
}
这里我们调用 Hibernate session 的 createQuery()
方法,第一个参数是类型化的 JPQL 查询语句,第二个参数是返回实体的类型。执行查询时通过调用 getResultList()
方法获取结果列表。
✅ 优点:写法简单直观,接近 SQL 语法,便于快速上手和维护。
3. Criteria API
Criteria API 提供了一种更加动态和类型安全的方式来构造 JPA 查询。
它通过创建 Java 对象来表示查询元素,从而避免了大量的字符串拼接操作,在处理包含多个可选条件的复杂查询时更具优势。
我们刚刚看了使用 JPQL 实现的“查询全部”示例,现在来看等价的 Criteria API 写法:
public List<Student> findAllStudentsWithCriteriaQuery() {
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Student> cq = cb.createQuery(Student.class);
Root<Student> rootEntry = cq.from(Student.class);
CriteriaQuery<Student> all = cq.select(rootEntry);
TypedQuery<Student> allQuery = session.createQuery(all);
return allQuery.getResultList();
}
步骤如下:
- 获取
CriteriaBuilder
实例 - 使用它创建一个类型化的
CriteriaQuery
- 设置查询根实体(Root)
- 构造查询选择部分
- 创建并执行
TypedQuery
获取结果
⚠️ 虽然这种方式代码量稍多,但它提供了完整的 Java 编程能力来构建查询逻辑,更适合用于动态查询或需要复用的部分。
此外,JPQL 和 Criteria API 在性能方面基本一致,可根据项目需求灵活选用。
4. 总结
本文展示了两种使用 Hibernate 获取表中所有记录的方式:JPQL 和 Criteria API。
- ✅ JPQL:语法简洁,适合固定结构的查询
- ✅ Criteria API:更灵活、类型安全,适用于动态查询场景
示例完整源码可在 GitHub 找到。