Hibernate — примеры именованных запросов NamedQuery

В Hibernate существует поддержка именованных запросов, которые называются NamedQueries. Рассмотрим пример использования таких запросов в Hibernate.

Используемые технологии:

Hibernate 5.0.1.Final

Maven 3.2.5

IntelliJ IDEA 14

MySQL 5.6.25

1. Создание именованных запросов NamedQuery в Hibernate

Как понятно из названия именованные запросы — это такие запросы, которые вызываются по имени. К преимуществом такого подхода можно выделить более легкое сопровождение кода, т.к. ваши запросы не выглядят как телега кода с select, insert и т.п. в разных местах, а можно всё сложить в один xml или класс.

Проект полностью использует таблицы и данные из Hibernate – примеры Criteria, поэтому рекомендую сначала глянуть код в этой статье. Приведу данные из заполненной таблицы:

Criteria example table

2. Создание запроса в Hibernate с помощью аннотации @NamedQuery (@NamedQueries)

В этом примере я буду вытаскивать данные из таблицы contact, которая приведена выше. Для этого создадим именованный запрос getContactsQuery:

Запрос достаточно простой — вывести всё, где id>= переданного значения.

3. Создание именованного запроса в Hibernate с помощью xml

Т.к. в прошлой статье ничего кроме аннотаций не использовалось, то здесь пришлось добавить настройки в xml.

hibernate.cfg.xml:

И в ту же папку resources добавлен файл ContactEntity.hbm.xml, где создан запрос с именем xmlGetContactsQuery:

Замечание — не помещайте запрос выше элемента <class> иначе будет ошибка. Также вы наверное заметили, что запрос обернут в CDATA[], это сделано для того, чтобы при обработке xml не выдавалась ошибка обработки специальных символов вроде < > и т.п..

3. Выполнение запроса

Всё выполняется в одном методе main(). Обратите внимание, что будет работать или вариант с аннотацией или с xml. В противном случае на один из них будет выдаваться ошибка, что запрос с таким именем не найден.

Результат будет одинаков:

Print result:
ContactEntity{id=10, firstName=’Name2′, lastName=’LastName2′, birthDate=2014-05-01, version=0}
ContactEntity{id=11, firstName=’Name3′, lastName=’LastName3′, birthDate=2016-09-02, version=0}
ContactEntity{id=12, firstName=’Name4′, lastName=’LastName4′, birthDate=2015-11-01, version=0}
ContactEntity{id=13, firstName=’Name5′, lastName=’LastName5′, birthDate=2012-09-07, version=0}

Исходные коды

*Коды базы данных можете найти в предыдущей статье, указанный в начале статьи

Hibernate NamedQuery — исходный код

Share Button
4
17133 Total Views 1 Views Today

6 thoughts on “Hibernate — примеры именованных запросов NamedQuery

  1. Регина Федотова:

    named query совершенно не для тех целей для чего вы их взялись использовать, а для того чтобы делать средствами SQL сервера, те вещи которые он умеет делать хорошо, чтобы не тащить все данные в коллекцию и не обрабатывать их на стороне ДАО

    1. Nick V.:

      Статья для тех, кто хочет вообще посмотреть как сделать named query и какие для этого нужны базовые настройки. Соответственно и простенький пример для выборки данных из одной таблицы.
      Описывать реально применяемый запрос с десятком связей между таблицами (которые здесь тоже нужно было бы показать), сортировкой и др. в учебной статье мне кажется лишним.

  2. Rus:

    Не работает именные запросы в текущем проекте. Может быть есть какие-то недочёты или что-то не учли?

    1. Скриншоты и результаты из кода статьи, поэтому код рабочий.

  3. sanya:

    Есть парочка вопросов:
    1. если в именованном запросе связать две таблицы, и поле id будет повторяться, то hibernate автоматически оставит только уникальные, как этого избежать?
    2. в чем разница между schema и catalog?
    Спасибо

      1. Использовать алиса для таблицы
      2. Каталог и схема это пространства имен. В разных БД может работать по разному. В общем случае каталог содержит схемы, схемы содержат таблицы (является пространством имен для таблиц и правил безопасности).

Добавить комментарий