Рубрики
Без рубрики

Руководство для начинающих по JPA и подсказкам для запросов в режиме гибернации

Узнайте, какова цель подсказок для запросов JPA, и получите подробное объяснение доступных подсказок для запросов JPA, а также тех, которые относятся к режиму гибернации.

Автор оригинала: Vlad Mihalcea.

Вступление

В этой статье мы рассмотрим, что такое подсказки для запросов JPA, и познакомимся со всеми подсказками для запросов, поддерживаемыми Hibernate.

Понимание подсказок для запросов Hibernate очень важно при разработке нетривиального корпоративного приложения, поскольку они позволяют настраивать способ выполнения запросов в Hibernate.

Руководство для начинающих по JPA и подсказкам для запросов в режиме гибернации @vlad_mihalcea https://t.co/9V7UcuBQ7C pic.twitter.com/LugFjLoWxt

Подсказки для запросов JPA

API сохранения Java определяет понятие подсказка запроса , которое, в отличие от того, что может предполагать его название, не имеет ничего общего с подсказками запроса базы данных. Подсказка запроса JPA-это опция настройки поставщика сохраняемости Java.

Чтобы передать подсказку запроса, спецификация JPA определяет setHint метод javax.persistence.Запрос интерфейс.

Чтобы передать подсказку запроса, спецификация JPA определяет || setHint || метод || javax.persistence.Запрос || интерфейс.

Самой первой подсказкой запроса, поддерживаемой стандартом JPA, была javax.persistence.query.timeout тот, который определяет количество миллисекунд, в течение которых разрешается выполнять данный запрос JPA. За кулисами эта подсказка даст команду Hibernate вызвать метод PreparedStatement.setQueryTimeout для соответствующего SQL-запроса, который выполняется.

В следующем примере показано, как настроить javax.persistence.запрос.тайм-аут Подсказка по запросу JPA.

List posts = entityManager
.createQuery(
    "select p " +
    "from Post p " +
    "where lower(p.title) like lower(:titlePattern)", Post.class)
.setParameter("titlePattern", "%Hibernate%")
.setHint("javax.persistence.query.timeout", 50)
.getResultList();

В следующем примере показано, как настроить || javax.persistence.запрос.тайм-аут || Подсказка по запросу JPA.

JPA 2.1 представил javax.постоянство.fetchgraph подсказка запроса, а также для предоставления графика выборки для конкретного запроса, который переопределяет план выборки по умолчанию, определенный сопоставлением сущностей.

В соответствии со спецификацией JPA, javax.persistence.подсказка запроса fetchgraph должна охотно извлекать только те ассоциации, которые явно указаны в предоставленном в данный момент графике выборки, в то время как остальные ассоциации следует извлекать лениво.

Однако, поскольку ленивая выборка не является обязательным требованием, поведение в режиме гибернации для javax.persistence.подсказка запроса fetchgraph отличается тем, что ассоциации, не указанные в предоставленном графике выборки, извлекаются в соответствии со стратегией извлечения сопоставления сущностей.

javax.настойчивость.подсказка запроса fetchgraph может быть указана следующим образом:

PostComment comment = entityManager
.find(
    PostComment.class, 
    1L,
    Collections.singletonMap(
        "javax.persistence.fetchgraph",
        entityManager.getEntityGraph("PostComment.post")
    )
);

|| javax.настойчивость.подсказка запроса fetchgraph || может быть указана следующим образом:

JPA 2.1 также представила подсказку javax.persistence.loadgraph запроса, чтобы предоставить график выборки для конкретного запроса, который переопределяет план выборки по умолчанию, определенный сопоставлением сущностей.

Согласно спецификации JPA, подсказка javax.persistence.loadgraph запроса должна охотно извлекать только те ассоциации, которые явно указаны в предоставленном в настоящее время графике выборки, в то время как оставшаяся ассоциация должна быть извлечена в соответствии с их стратегией извлечения сопоставления.

Подсказка javax.persistence.loadgraph запроса может быть указана следующим образом:

PostComment comment = entityManager
.find(
    PostComment.class, 
    1L,
    Collections.singletonMap(
        "javax.persistence.loadgraph",
        entityManager.getEntityGraph("PostComment.post")
    )
);

Для получения более подробной информации о графиках сущностей JPA ознакомьтесь с этой статьей .

Подсказки для запросов в режиме гибернации

В отличие от JPA, Hibernate предлагает несколько подсказок для запросов, которые можно использовать для настройки выполнения данного запроса. Чтобы упростить способ ссылки на заданную подсказку запроса, Hibernate предлагает класс QueryHints , который выглядит следующим образом:

Подсказки запроса Hibernate, определенные классом Подсказки запроса , можно резюмировать следующим образом:

Эквивалентно методу setCacheMode в org.hibernate.запрос.Запрос Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. CACHE_MODE
Эквивалентно методу setCacheRegion организации.hibernate.запрос.Запрос Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. CACHE_REGION
Эквивалентно методу setCacheable организации.hibernate.запрос.Запрос Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. КЭШИРУЕМЫЙ
Полезно для именованных запросов, которые необходимо выполнить с помощью JDBC CallableStatement Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. ПОДЛЕЖАЩИЙ ВЫКУПУ
Эквивалентно методу setComment организации.hibernate.запрос.Запрос Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. КОММЕНТАРИЙ
Эквивалентно методу setFetchSize в org.hibernate.запрос.Запрос Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. РАЗМЕР ВЫБОРКИ
Эквивалентно методу setFlushMode в org.hibernate.запрос.Запрос Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. FLUSH_MODE
Переопределите метод блокировки с последующим использованием org.hibernate.dialect.Диалект Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. FOLLOW_ON_LOCKING
Укажите пользовательскую сохраняемость javax.LockModeType или org.спящий режим.Режим блокировки для текущего запроса Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. NATIVE_LOCKMODE
Предотвратите передачу ключевого слова JPQL или API критериев DISTINCT в SQL – запрос Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. PASS_DISTINCT_THROUGH
Эквивалентно setReadOnly организации.спящий режим.запрос.Запрос Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. ТОЛЬКО ДЛЯ ЧТЕНИЯ
Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в секундах. Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. TIMEOUT_HIBERNATE
Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. Эквивалентно выходу из спящего режима организации.запрос.Запрос. Значение тайм-аута указывается в миллисекундах. TIMEOUT_JPA

Хотя вы можете настроить выполнение запроса с помощью интерфейсов запросов для гибернации (например, org.hibernate.запрос.Запрос ), если вы используете JPA java.persistence.Интерфейс запроса , вам не нужно разворачивать его, чтобы получить доступ к вышеупомянутым параметрам настройки запроса, так как вы можете просто использовать эквивалентную подсказку запроса Hibernate.

Поэтому, чтобы получить объекты Post в режиме только для чтения, вам просто нужно использовать подсказку org.hibernate.readOnly запроса, как в следующем примере:

List posts = entityManager
.createQuery(
    "select p " +
    "from Post p", Post.class)
.setHint(QueryHints.READ_ONLY, true)
.getResultList();

Спящий режим.query.pass Distinct Through подсказка запроса-это единственный способ предотвратить передачу ключевого слова JPQL DISTINCT в связанный SQL-запрос.

Вывод

Механизм подсказок для запросов JPA позволяет настроить способ выполнения данного запроса в режиме гибернации. Например, вы можете указать пороговое значение времени ожидания или указать, что возвращаемые объекты должны извлекаться в режиме только для чтения.