Что такое JPQL и чем он отличается от SQL?

«Что такое JPQL и чем он отличается от SQL?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

JPQL (Java Persistence Query Language) — это объектно-ориентированный язык запросов, определенный в спецификации JPA. Он предназначен для выполнения операций над сущностями и их атрибутами, а не над таблицами и колонками базы данных.

Ключевое отличие от SQL: Критерий JPQL SQL
Цель Работа с объектной моделью (классы, поля) Работа с реляционной моделью (таблицы, столбцы)
Полиморфизм Поддерживает (запрос к родительскому классу вернет и экземпляры дочерних) Не поддерживает
Переносимость Абстрагирован от диалекта конкретной СУБД Зависит от диалекта СУБД (MySQL, PostgreSQL и т.д.)

Пример JPQL-запроса:

// Выборка сущностей User по имени и возрасту
String jpql = "SELECT u FROM User u WHERE u.name = :name AND u.age > :minAge";
TypedQuery<User> query = entityManager.createQuery(jpql, User.class);
query.setParameter("name", "Alice");
query.setParameter("minAge", 25);
List<User> users = query.getResultList();

Основные возможности JPQL:

  • Именованные параметры (:paramName) для безопасной подстановки значений.
  • Явные и неявные JOIN по связям между сущностями.
  • Функции агрегации (COUNT, SUM, AVG).
  • Проекции — выборка не целых сущностей, а отдельных полей или конструкторов (SELECT NEW UserDTO(u.name, u.email) FROM User u).
  • Определение через аннотации: @NamedQuery позволяет объявить запрос прямо в классе сущности.

JPQL транслируется поставщиком JPA (Hibernate, EclipseLink) в нативный SQL, специфичный для используемой базы данных.