Hibernate Query Language (HQL)

Hibernate Query Language (HQL)
HQL – объектно-ориентированный язык запросов, очень похожий на SQL, но оперирует сущностями и их полями вместо таблиц и колонок.
Поддерживает ключевые слова, привычные из SQL: SELECT, FROM, WHERE, ORDER BY, GROUP BY и агрегатные функции (COUNT, SUM, MAX, MIN, AVG). Запросы HQL транслируются Hibernate в соответствующий SQL, адаптированный под конкретную базу.
Примеры синтаксиса:
FROM Product – получить все объекты Product (эквивалентно SELECT * FROM product_table).
SELECT u.name FROM User u WHERE u.age > 18 ORDER BY u.name – выборка имен пользователей старше 18, сортировка по имени. Здесь User – это класс-сущность, а u.name и u.age – свойства объекта, сопоставленные с колонками.
Поддерживаются соединения (JOIN) между сущностями по отношениям, например: SELECT o FROM Order o JOIN o.customer c WHERE c.region = 'EU'. Hibernate сам выведет нужное условие по внешнему ключу.
Плюсы HQL: независимость от SQL-диалекта (Hibernate сам подставит правильный синтаксис, например функции дат для MySQL vs PostgreSQL), безопасность (именованные параметры, исключение SQL-инъекций при правильном использовании), и удобство – работаем на уровне объектов.



Пояснение

 HQL по сути – это та же идея, что и SQL, но с учетом, что вы уже описали маппинг классов. Поэтому:
В HQL вы указываете имена классов и свойств ровно так, как в Java-коде. Например, User и поле age. Hibernate знает, с какой таблицей связан класс User и какая колонка соответствует age, и подставит их.
Вам не нужно писать JOIN через внешние ключи вручную. Достаточно использовать связь, определенную в классах. Например, o.customer в запросе – Hibernate понимает, что Order связан с Customer определенной связью @ManyToOne, и осуществит правильное соединение.
HQL может возвращать не только сущности, но и любые данные. Можно выбирать отдельные поля (как u.name выше) – тогда результатом будет не сущность, а просто значение (или tuple значений). Можно даже создавать новые объекты прямо в запросе (конструкторный выражения): SELECT NEW com.example.dto.UserDTO(u.name, u.age) FROM User u – Hibernate построит объект UserDTO для каждой строки.
Для вставки, обновления и удаления HQL тоже предоставляет команды (они влияют на множество записей): UPDATE Product p SET p.price = p.price * 1.1 WHERE p.category = :cat, DELETE FROM Order o WHERE o.status = 'CANCELLED'. Эти операции выполняются через SQL bulk operations и не требуют загрузки объектов в память.
Чтобы выполнить HQL-запрос, используется либо Hibernate API (Session.createQuery()), либо JPA API:
List<User> users = entityManager.createQuery(
"SELECT u FROM User u WHERE u.active = true", User.class)
.getResultList();
Здесь строка – это HQL/JPQL запрос. В Spring Data JPA разработчик обычно пишет репозитории, и сложные запросы могут быть описаны как @Query с JPQL внутри.
Автор: к.п.н., Румянцев Сергей Александрович, доцент Финансового университета при Правительстве РФ; доцент ОЧУВО Международного инновационного университета; Консалтинг, управление разработкой ПО; системный и бизнес анализ; менеджмент; аналитиз данных; управление ИТ. Телефон для связи +79269444818 (мессенджеры)   Короткая ссылка:
Hibernate Query Language (HQL)
HQL – объектно-ориентированный язык запросов, очень похожий на SQL, но оперирует сущностями и их полями вместо таблиц и колонок.
Поддерживает ключевые слова, привычные из SQL: SELECT, FROM, WHERE, ORDER BY, GROUP BY и агрегатные функции (COUNT, SUM, MAX, MIN, AVG). Запросы HQL транслируются Hibernate в соответствующий SQL, адаптированный под конкретную базу.
Примеры синтаксиса:
FROM Product – получить все объекты Product (эквивалентно SELECT * FROM product_table).
SELECT u.name FROM User u WHERE u.age > 18 ORDER BY u.name – выборка имен пользователей старше 18, сортировка по имени. Здесь User – это класс-сущность, а u.name и u.age – свойства объекта, сопоставленные с колонками.
Поддерживаются соединения (JOIN) между сущностями по отношениям, например: SELECT o FROM Order o JOIN o.customer c WHERE c.region = 'EU'. Hibernate сам выведет нужное условие по внешнему ключу.
Плюсы HQL: независимость от SQL-диалекта (Hibernate сам подставит правильный синтаксис, например функции дат для MySQL vs PostgreSQL), безопасность (именованные параметры, исключение SQL-инъекций при правильном использовании), и удобство – работаем на уровне объектов.



Пояснение

 HQL по сути – это та же идея, что и SQL, но с учетом, что вы уже описали маппинг классов. Поэтому:
В HQL вы указываете имена классов и свойств ровно так, как в Java-коде. Например, User и поле age. Hibernate знает, с какой таблицей связан класс User и какая колонка соответствует age, и подставит их.
Вам не нужно писать JOIN через внешние ключи вручную. Достаточно использовать связь, определенную в классах. Например, o.customer в запросе – Hibernate понимает, что Order связан с Customer определенной связью @ManyToOne, и осуществит правильное соединение.
HQL может возвращать не только сущности, но и любые данные. Можно выбирать отдельные поля (как u.name выше) – тогда результатом будет не сущность, а просто значение (или tuple значений). Можно даже создавать новые объекты прямо в запросе (конструкторный выражения): SELECT NEW com.example.dto.UserDTO(u.name, u.age) FROM User u – Hibernate построит объект UserDTO для каждой строки.
Для вставки, обновления и удаления HQL тоже предоставляет команды (они влияют на множество записей): UPDATE Product p SET p.price = p.price * 1.1 WHERE p.category = :cat, DELETE FROM Order o WHERE o.status = 'CANCELLED'. Эти операции выполняются через SQL bulk operations и не требуют загрузки объектов в память.
Чтобы выполнить HQL-запрос, используется либо Hibernate API (Session.createQuery()), либо JPA API:
List<User> users = entityManager.createQuery(
"SELECT u FROM User u WHERE u.active = true", User.class)
.getResultList();
Здесь строка – это HQL/JPQL запрос. В Spring Data JPA разработчик обычно пишет репозитории, и сложные запросы могут быть описаны как @Query с JPQL внутри.
https://webprogr.ru/~kdzxH
Короткая ссылка на новость:https://webprogr.ru/~kdzxH


Последние новости

Hibernate Query Language (HQL)

Hibernate Query Language (HQL)
HQL – объектно-ориентированный язык запросов, очень похожий на SQL, но оперирует сущностями и их полями вместо таблиц и колонок.
Поддерживает ключевые слова, привычные из SQL: SELECT, FROM, WHERE, ORDER BY, GROUP BY и агрегатные функции (COUNT, SUM, MAX, MIN, AVG). Запросы HQL транслируются Hibernate в соответствующий SQL, адаптированный под конкретную базу.
Примеры синтаксиса:
FROM Product – получить все объекты Product (эквивалентно SELECT * FROM product_table).
SELECT u.name FROM User u WHERE u.age > 18 ORDER BY u.name – выборка имен пользователей старше 18, сортировка по имени. Здесь User – это класс-сущность, а u.name и u.age – свойства объекта, сопоставленные с колонками.
Поддерживаются соединения (JOIN) между сущностями по отношениям, например: SELECT o FROM Order o JOIN o.customer c WHERE c.region = 'EU'. Hibernate сам выведет нужное условие по внешнему ключу.
Плюсы HQL: независимость от SQL-диалекта (Hibernate сам подставит правильный синтаксис, например функции дат для MySQL vs PostgreSQL), безопасность (именованные параметры, исключение SQL-инъекций при правильном использовании), и удобство – работаем на уровне объектов.



Пояснение

 HQL по сути – это та же идея, что и SQL, но с учетом, что вы уже описали маппинг классов. Поэтому:
В HQL вы указываете имена классов и свойств ровно так, как в Java-коде. Например, User и поле age. Hibernate знает, с какой таблицей связан класс User и какая колонка соответствует age, и подставит их.
Вам не нужно писать JOIN через внешние ключи вручную. Достаточно использовать связь, определенную в классах. Например, o.customer в запросе – Hibernate понимает, что Order связан с Customer определенной связью @ManyToOne, и осуществит правильное соединение.
HQL может возвращать не только сущности, но и любые данные. Можно выбирать отдельные поля (как u.name выше) – тогда результатом будет не сущность, а просто значение (или tuple значений). Можно даже создавать новые объекты прямо в запросе (конструкторный выражения): SELECT NEW com.example.dto.UserDTO(u.name, u.age) FROM User u – Hibernate построит объект UserDTO для каждой строки.
Для вставки, обновления и удаления HQL тоже предоставляет команды (они влияют на множество записей): UPDATE Product p SET p.price = p.price * 1.1 WHERE p.category = :cat, DELETE FROM Order o WHERE o.status = 'CANCELLED'. Эти операции выполняются через SQL bulk operations и не требуют загрузки объектов в память.
Чтобы выполнить HQL-запрос, используется либо Hibernate API (Session.createQuery()), либо JPA API:
List<User> users = entityManager.createQuery(
"SELECT u FROM User u WHERE u.active = true", User.class)
.getResultList();
Здесь строка – это HQL/JPQL запрос. В Spring Data JPA разработчик обычно пишет репозитории, и сложные запросы могут быть описаны как @Query с JPQL внутри.
Рейтинг@Mail.ru