Ответ
JPQL (Java Persistence Query Language) и HQL (Hibernate Query Language) — это объектно-ориентированные языки запросов, но с разной областью применения.
JPQL — это стандартизированный язык, часть спецификации JPA. Он предназначен для работы с сущностями JPA и должен поддерживаться любым провайдером JPA (Hibernate, EclipseLink, OpenJPA).
HQL — это собственный язык запросов фреймворка Hibernate. Он появился раньше JPQL и исторически богаче возможностями.
Основные различия:
- Стандарт vs Проприетарный: JPQL — стандарт JPA, HQL — специфичен для Hibernate.
- Возможности: HQL часто имеет расширенный синтаксис и функции по сравнению с базовым JPQL (например, более гибкие DML-операции
UPDATE/DELETE). - Переносимость: Запрос 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 запилить похитрее.
Короче, разница:
- JPQL — для переносимого кода, чтоб не привязываться к одному провайдеру как сосалка.
- 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. Волнение ебать, но выбирать тебе.