Автор оригинала: 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.
Listposts = 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
запроса, как в следующем примере:
Listposts = entityManager .createQuery( "select p " + "from Post p", Post.class) .setHint(QueryHints.READ_ONLY, true) .getResultList();
Спящий режим.query.pass Distinct Through
подсказка запроса-это единственный способ предотвратить передачу ключевого слова JPQL DISTINCT в связанный SQL-запрос.
Вывод
Механизм подсказок для запросов JPA позволяет настроить способ выполнения данного запроса в режиме гибернации. Например, вы можете указать пороговое значение времени ожидания или указать, что возвращаемые объекты должны извлекаться в режиме только для чтения.