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();
}

步骤如下:

  1. 获取 CriteriaBuilder 实例
  2. 使用它创建一个类型化的 CriteriaQuery
  3. 设置查询根实体(Root)
  4. 构造查询选择部分
  5. 创建并执行 TypedQuery 获取结果

⚠️ 虽然这种方式代码量稍多,但它提供了完整的 Java 编程能力来构建查询逻辑,更适合用于动态查询或需要复用的部分。

此外,JPQL 和 Criteria API 在性能方面基本一致,可根据项目需求灵活选用。

4. 总结

本文展示了两种使用 Hibernate 获取表中所有记录的方式:JPQL 和 Criteria API。

  • ✅ JPQL:语法简洁,适合固定结构的查询
  • ✅ Criteria API:更灵活、类型安全,适用于动态查询场景

示例完整源码可在 GitHub 找到。


原始标题:Get All Data from a Table with Hibernate