«1. Обзор

В этом кратком руководстве мы рассмотрим, как получить все данные из таблицы с помощью Hibernate, используя JPQL или Criteria API.

JPQL обеспечивает более быструю и простую реализацию, а использование Criteria API является более динамичным и надежным.

2. JPQL

JPQL предоставляет простой и понятный способ получения всех сущностей из таблицы.

Давайте посмотрим, как может выглядеть извлечение всех студентов из таблицы с помощью JPQL:

public List<Student> findAllStudentsWithJpql() {
    return session.createQuery("SELECT a FROM Student a", Student.class).getResultList();      
}

Метод createQuery() нашего сеанса Hibernate получает типизированную строку запроса в качестве первого аргумента и тип объекта в качестве второго. Мы выполняем запрос с вызовом метода getResultList(), который возвращает результаты в виде типизированного списка.

Преимуществом этого подхода является простота. JPQL очень близок к 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. Позже мы устанавливаем корневую запись для запроса. И, наконец, мы выполняем его с помощью метода getResultList().

Этот подход аналогичен тому, что мы делали ранее. Но это дает нам полный доступ к языку Java, чтобы сформулировать больше нюансов при формулировании запроса.

Запросы JPQL и запросы на основе критериев JPA не только похожи, но и имеют одинаковую производительность.

4. Заключение

В этой статье мы продемонстрировали, как получить все сущности из таблицы с помощью JPQL или Criteria API.

Полный исходный код примера доступен на GitHub.