JPA Named Queries против Criteria API? - PullRequest
       17

JPA Named Queries против Criteria API?

26 голосов
/ 07 сентября 2011

Существует ли эвристический / передовой опыт / набор правил для решения между Criteria API и NamedQuery ?

Мои мысли пока:
Именованные запросыкак правило, более читабельны.Критерии запросов более гибкие.
Оба предварительно скомпилированы.Я склонен полагаться на использование именованных запросов как можно дольше, а затем переходить на критерии.

Но, может быть, желание «упростить» запрос с помощью API критериев - это намек на неоптимальный дизайн (т.е. разделение интересов)?

Спасибо

Ответы [ 5 ]

34 голосов
/ 07 сентября 2011

Именованные запросы более оптимальны (они разбираются / готовятся один раз).Запросы критериев являются динамическими (они не прекомпилированы, хотя некоторые поставщики JPA, такие как EclipseLink, поддерживают кэш подготовки критериев).

Я бы использовал критерии только для динамических запросов.

10 голосов
/ 07 сентября 2011

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

Для статических запросов JPQL гораздо более читабелен, и я предпочитаю использовать их, чем критерии запросов.Вы можете потерять некоторую безопасность, но юнит-тесты должны сделать вас более уверенным.

4 голосов
/ 31 июля 2012

Другая точка зрения состоит в том, что, хотя запрос критерия не так удобен для чтения, он безопасен для типов, поэтому обеспечивает проверку типов времени компиляции.Если вы изменяете базу данных в проектах, где есть много сущностей и много запросов, очень полезно во время компиляции увидеть, какие запросы пошли не так из-за изменения.

С другой стороны, я не уверенэто выгоднее, чем простота JPQL

2 голосов
/ 16 марта 2014

Я фактически прошел через источник Hibernate (4.3.0-SNAPSHOT) и источник EclipseLink (2.5.0-SNAPSHOT) и просмотрел реализацию JPA в каждом.

EclipseLink явно не безопасен для потоков, как вы описываете. В частности, он пытается пересчитать объединения несколько раз.

Реализация Hibernate выглядит для меня поточно-ориентированной. Я не уверен на 100%, но, похоже, так и есть. Я бы сказал, что в будущем это не гарантируется, поскольку это не указано.

Тем не менее, я предупрежу вас, я не думаю, что вы получите много. Исходя из того, что я смотрю, большая часть компиляции запроса фактически выполняется во время фазы «createQuery», поэтому вы даже не получите большого кеширования результатов.

1 голос
/ 06 июня 2014

JPA также предоставляет способ создания статических запросов в виде именованных запросов с использованием аннотаций @NamedQuery и @NamedQueries. В JPA считается хорошей практикой предпочитать именованные запросы динамическим запросам, когда это возможно. От http://www.objectdb.com/java/jpa/query/api

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...