JPQL

Базовый Java
≈ 1 мин чтения

JPQL обращается к Entity, а не напрямую к таблицам

JPQL похож на SQL, но запрос формулируется в терминах persistence-модели. Вместо имени таблицы используется имя Entity, а вместо столбцов — её persistent-поля или свойства.

List<User> users = entityManager.createQuery(
        "select u from User u where u.active = :active",
        User.class)
    .setParameter("active", true)
    .getResultList();

Здесь User — Entity, u.active — её атрибут, а результат сразу имеет тип List<User>. Provider преобразует JPQL в запрос к конкретной базе данных.

Параметры передаются отдельно от текста запроса

Как и с PreparedStatement, значения не нужно склеивать со строкой запроса. Именованный параметр :active делает запрос понятнее и отделяет структуру запроса от данных.

Связи можно использовать прямо в выражениях

List<Order> orders = entityManager.createQuery(
        "select o from Order o where o.user.id = :userId",
        Order.class)
    .setParameter("userId", 42L)
    .getResultList();

JPQL умеет навигироваться по отображённым отношениям Entity. Но удобный объектный синтаксис не отменяет стоимости итогового SQL, поэтому сложные запросы всё равно нужно оценивать с точки зрения базы данных.