В чем разница между JPQL и HQL?

Ответ

JPQL (Java Persistence Query Language) и HQL (Hibernate Query Language) — это объектно-ориентированные языки запросов, но с разной областью применения.

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

HQL — это собственный язык запросов фреймворка Hibernate. Он появился раньше JPQL и исторически богаче возможностями.

Основные различия:

  1. Стандарт vs Проприетарный: JPQL — стандарт JPA, HQL — специфичен для Hibernate.
  2. Возможности: HQL часто имеет расширенный синтаксис и функции по сравнению с базовым JPQL (например, более гибкие DML-операции UPDATE/DELETE).
  3. Переносимость: Запрос JPQL можно использовать с другим JPA-провайдером. HQL привязан к Hibernate.

Пример JPQL (стандарт JPA):

// Явное указание SELECT, использование именованного параметра
TypedQuery<Employee> q = em.createQuery(
    "SELECT e FROM Employee e WHERE e.department.name = :deptName",
    Employee.class
);
q.setParameter("deptName", "Sales");

Пример HQL (Hibernate):

// SELECT может быть опущен, запрос часто короче
Query<Employee> q = session.createQuery(
    "FROM Employee WHERE department.name = :deptName",
    Employee.class
);
q.setParameter("deptName", "Sales");

Рекомендация: Для новой разработки с JPA предпочтительнее использовать JPQL для обеспечения переносимости. HQL используется для специфичных оптимизаций Hibernate.

Ответ 18+ 🔞

Да ты посмотри, какая хуйня развелась — JPQL и HQL! Как будто одного мало, так нет, надо два почти одинаковых языка, чтобы мозги ебать разработчикам.

Смотри, суть в чём, чтобы не запутаться в этих пиздопроебищах.

JPQL — это как ГОСТ, блядь. Стандарт такой, официальный. Часть этой вашей JPA, которую все должны поддерживать. Хочешь на Hibernate работать, хочешь на EclipseLink — везде этот JPQL должен прокатить. Как сосиска в тесте: универсальная хуйня.

HQL — это уже фирменный соус от Hibernate, овердохуища возможностей. Он старше, наглее и часто может то, на что JPQL смотрит и тихо бздит. Например, эти их UPDATE/DELETE запилить похитрее.

Короче, разница:

  1. JPQL — для переносимого кода, чтоб не привязываться к одному провайдеру как сосалка.
  2. HQL — когда надо выжать из Хибера всё, даже то, что спрятано, и похуй на переносимость.

Вот тебе пример JPQL (правильный, скучный):

TypedQuery<Employee> q = em.createQuery(
    "SELECT e FROM Employee e WHERE e.department.name = :deptName",
    Employee.class
);
q.setParameter("deptName", "Sales");

Видишь? Явно SELECT указал, всё чинно-благородно. Как в учебнике.

А теперь тот же запрос на HQL (как часто пишут в жизни):

Query<Employee> q = session.createQuery(
    "FROM Employee WHERE department.name = :deptName",
    Employee.class
);
q.setParameter("deptName", "Sales");

SELECT выкинули нахуй, короче. И так сойдёт, Хибер поймёт, хитрая жопа.

Итог, чувак: Если пишешь новый проект и не хочешь потом, чтобы он накрылся медным тазом при смене провайдера — юзай JPQL. А если впился в Hibernate как клещ и нужны его особые плюшки — тогда уже лезь в HQL. Волнение ебать, но выбирать тебе.