Hibernate — примеры Criteria. Обзор Hibernate Criteria API

Hibernate — примеры установки критериев (ограничений) Criteria. Сравнение с HQL

Hibernate Criteria API является альтернативным подходом к Hibernate Query Language (HQL). Этот подход более объектно-ориентирован и позволяет сократить необходимый код. Может быть рекомендован в проектах с большим количеством запросов с критериями.

 

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

Hibernate 5.0.1.Final

Maven 3.2.5

IntelliJ IDEA 14

MySQL 5.6.25

 

1. Описание задачи

Рассмотреть основы Hibernate Criteria и сравнить код с аналогом на HQL.

Будем делать следующую выборку — из таблицы с контактами вытаскиваем только те значения, у которых дата младше (новее) чем год назад.

 

2. Структура проекта

Используется база данных и классы из Hibernate – быстрый старт. Пример приложения Hello World. Там же есть исходники. Рекомендую прочитать эту статью, чтобы было понятно что и откуда берется_вставляется. Для наглядности приведу пример данных и таблицу, используемую в этой статье:

Criteria example table

 

3. Пример кода HQL

Рассмотрим вначале как выглядит код выборки из базы данных с установленными ограничениями в стиле HQL (примеры HQL: select, insert, delete, update).

Создаем запрос, который звучит как: вытащить все данные из ContactEntity где дата соответствует промежутку startDate endDate и отсортировать результат по дате.

4. Пример с использованием Criteria

Приведу распространенный, но уже устаревший вариант создания ограничений:

Смысл и результат такие же как в предыдущем пункте.

Важно

Обратите внимание, что Expression — уже @Deprecated. Но, что более важно в версии Hibernate, которая используется в этой статье и Restrictions тоже уходит в прошлое. Jboss.org указывает, что org.hibernate.Criteria API должно считаться устаревшим, а вместо этого необходимо использовать спецификацию JPA и javax.persistence.criteria.CriteriaQuery. JPA будет описываться в отдельной статье.

 

Criteria API

Простой запрос Criteria

Создать объект criteria и возвратить все записи ContactEntity из базы данных

Сортировка в запросе Criteria

Отсортировать результаты по возрастанию firstName:

 

Отсортировать результаты по убыванию firstName:

Запросы с ограничениями Criteria

Restrictions. eq; lt; le; gt; ge

 

Значение value равно 400:

 

Значение value меньше 400:

 

Значение value меньше или равно 400:

 

Значение value больше 400:

 

Значение value больше или равно 400:

 

Restriction.like

Значение firstName начинается с Name и дальше любые символы:

 

Restriction.between

Значение birth_date находится между датами:

 

Restriction.isNull, isNotNull

Значение birth_datenull:

 

Значение birth_dateне null:

 

Разделение результатов запроса Criteria

Начать с 20 записи и возвратить 15 следующих записей из базы данных:

 

Использовать или нет Criteria?

Как уже было сказано в замечании выше — в таком виде как в этой статье, нежелательно. Необходимо использовать стандарт JPA. Тем не менее кода, использующего этот подход очень много и он еще долго будет поддерживаться.

Также следует учесть, что вы не имеете никакого контроля над запросом, генерируемым Hibernate. Соответственно если важна производительность, то возможно следует рассмотреть другой подход.

Ещё одним минусом является сам текст запроса — в случае ошибки будет сложно отлавливать какой из запросов написан неверно. В случае именованных запросов всё будет замапино на объекты Java и увидеть исключение гораздо проще.

Вывод: использовать или нет Criteria нужно принимать исходя из потребностей проекта.

 

Ссылки для скачивания

hibernateCriteria — sql дамп для MySQL вместе с таблицами и данными

Hibernate Criteria — проект в IntelliJ IDEA

Share Button
12
33944 Total Views 5 Views Today

One thought on “Hibernate — примеры Criteria. Обзор Hibernate Criteria API

  1. Никита:

    Обратите внимание, что Expression — уже @Deprecated. Но, что более важно в версии Hibernate, которая используется в этой статье и Restrictions тоже уходит в прошлое. Jboss.org указывает, что org.hibernate.Criteria API должно считаться устаревшим, а вместо этого необходимо использовать спецификацию JPA и javax.persistence.criteria.CriteriaQuery. JPA будет описываться в отдельной статье

     

    С нетерпением жду)) У вас рассылка на почту приходит о новых статьях?

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