Учебники

Hibernate — Язык запросов

Hibernate Query Language (HQL) — это объектно-ориентированный язык запросов, похожий на SQL, но вместо работы с таблицами и столбцами HQL работает с постоянными объектами и их свойствами. HQL-запросы преобразуются Hibernate в обычные SQL-запросы, которые, в свою очередь, выполняют действия с базой данных.

Хотя вы можете использовать операторы SQL непосредственно с Hibernate, используя Native SQL, но я бы порекомендовал использовать HQL, когда это возможно, чтобы избежать проблем с переносимостью баз данных и воспользоваться преимуществами стратегий генерации и кэширования SQL в Hibernate.

Ключевые слова, такие как SELECT, FROM, WHERE и т. Д., Не чувствительны к регистру, но такие свойства, как имена таблиц и столбцов, чувствительны к регистру в HQL.

ОТ клаузулы

Вы будете использовать предложение FROM , если хотите загрузить полностью постоянные объекты в память. Ниже приведен простой синтаксис использования предложения FROM —

String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();

Если вам нужно полностью указать имя класса в HQL, просто укажите пакет и имя класса следующим образом:

String hql = "FROM com.hibernatebook.criteria.Employee";
Query query = session.createQuery(hql);
List results = query.list();

AS пункт

Предложение AS можно использовать для назначения псевдонимов классам в ваших HQL-запросах, особенно если у вас длинные запросы. Например, наш предыдущий простой пример будет следующим:

String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();

Ключевое слово AS является необязательным, и вы также можете указать псевдоним непосредственно после имени класса, как показано ниже:

String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();

ВЫБРАТЬ пункт

Предложение SELECT обеспечивает больший контроль над результирующим набором, чем предложение from. Если вы хотите получить несколько свойств объектов вместо всего объекта, используйте предложение SELECT. Ниже приведен простой синтаксис использования предложения SELECT для получения только поля first_name объекта Employee.

String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();

Следует отметить, что Employee.firstName является свойством объекта Employee, а не полем таблицы EMPLOYEE.

ГДЕ оговорка

Если вы хотите сузить конкретные объекты, которые возвращаются из хранилища, используйте предложение WHERE. Ниже приведен простой синтаксис использования предложения WHERE:

String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();

ЗАКАЗАТЬ по пункту

Чтобы отсортировать результаты вашего HQL-запроса, вам нужно использовать предложение ORDER BY . Вы можете упорядочить результаты по любому свойству объектов в наборе результатов по возрастанию (ASC) или по убыванию (DESC). Ниже приведен простой синтаксис использования предложения ORDER BY:

String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();

Если вы хотите отсортировать по более чем одному свойству, вы просто добавите дополнительные свойства в конец предложения по предложению, разделенные запятыми следующим образом:

String hql = "FROM Employee E WHERE E.id > 10 " +
             "ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();

Предложение GROUP BY

Этот пункт позволяет Hibernate извлекать информацию из базы данных и группировать ее по значению атрибута и, как правило, использовать результат для включения совокупного значения. Ниже приведен простой синтаксис использования предложения GROUP BY —

String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
             "GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();

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

Hibernate поддерживает именованные параметры в своих HQL-запросах. Это облегчает написание HQL-запросов, которые принимают ввод от пользователя, и вам не нужно защищаться от атак SQL-инъекций. Ниже приведен простой синтаксис использования именованных параметров —

String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();

ОБНОВЛЕНИЕ

Массовые обновления являются новыми для HQL с Hibernate 3, и удаляют работу в Hibernate 3 иначе, чем в Hibernate 2. Интерфейс Query теперь содержит метод executeUpdate () для выполнения операторов HQL UPDATE или DELETE.

Предложение UPDATE может использоваться для обновления одного или нескольких свойств одного или нескольких объектов. Ниже приведен простой синтаксис использования предложения UPDATE —

String hql = "UPDATE Employee set salary = :salary "  + 
             "WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

УДАЛИТЬ пункт

Предложение DELETE может использоваться для удаления одного или нескольких объектов. Ниже приведен простой синтаксис использования предложения DELETE:

String hql = "DELETE FROM Employee "  + 
             "WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

Вставить пункт

HQL поддерживает предложение INSERT INTO только тогда, когда записи могут быть вставлены из одного объекта в другой. Ниже приведен простой синтаксис использования предложения INSERT INTO:

String hql = "INSERT INTO Employee(firstName, lastName, salary)"  + 
             "SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);

Агрегатные методы

HQL поддерживает ряд агрегатных методов, похожих на SQL. Они работают так же, как в HQL, так и в SQL, и ниже приведен список доступных функций:

Sr.No. Функции и описание
1

avg (название объекта)

Средняя стоимость имущества

2

считать (имя свойства или *)

Сколько раз свойство встречается в результатах

3

max (имя свойства)

Максимальное значение значения свойства

4

мин (название объекта)

Минимальное значение значения свойства

5

сумма (название объекта)

Общая сумма стоимости имущества

avg (название объекта)

Средняя стоимость имущества

считать (имя свойства или *)

Сколько раз свойство встречается в результатах

max (имя свойства)

Максимальное значение значения свойства

мин (название объекта)

Минимальное значение значения свойства

сумма (название объекта)

Общая сумма стоимости имущества

Отдельное ключевое слово учитывает только уникальные значения в наборе строк. Следующий запрос вернет только уникальный счет —

String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();

Нумерация страниц с использованием запроса

Существует два метода интерфейса Query для разбивки на страницы.

Sr.No. Метод и описание
1

Запрос setFirstResult (int startPosition)

Этот метод принимает целое число, представляющее первую строку в вашем наборе результатов, начиная со строки 0.

2

Запрос setMaxResults (int maxResult)

Этот метод сообщает Hibernate о получении фиксированного числа maxResults объектов.

Запрос setFirstResult (int startPosition)

Этот метод принимает целое число, представляющее первую строку в вашем наборе результатов, начиная со строки 0.

Запрос setMaxResults (int maxResult)

Этот метод сообщает Hibernate о получении фиксированного числа maxResults объектов.

Используя два вышеупомянутых метода вместе, мы можем создать пейджинговый компонент в нашем веб-приложении или приложении Swing. Ниже приведен пример, который вы можете расширить, чтобы получить 10 строк за раз: