Ответ
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, специфичный для используемой базы данных.