Когда человеку следует использовать собственные запросы с JPA 2.0 вместо JPQL или CriteriaBuilder? - PullRequest
8 голосов
/ 03 марта 2012

Я очень озадачен тем, когда и когда не следует использовать нативные запросы в JPA 2.0.У меня сложилось впечатление, что использование собственных запросов может привести к потере синхронизации с кешем JPA.Если я могу выполнить то же самое с помощью запроса JPQL или CriteriaBuilder, есть ли веская причина использовать собственный запрос?Точно так же, есть ли опасность при использовании нативного запроса, если я могу выполнить то же самое с помощью JPQL или CriteriaBuilder?И, наконец, если существует опасность в использовании собственного запроса, поскольку он не синхронизирован с кешем JPA, существует ли такая же опасность при выполнении эквивалентного запроса с JPQL или CriteriaBuilder?избегайте нативных запросов, но наверняка бывают моменты, когда они необходимы.Мне кажется, что если я могу сделать это с помощью JPQL или CriteriaBuilder, то мне следует.

Спасибо.

1 Ответ

13 голосов
/ 03 марта 2012

Я согласен с вашей философией.

Основная проблема с нативными запросами, ИМХО, заключается в удобстве обслуживания. Прежде всего, они, как правило, более сложны и длиннее, чем запросы JPQL. Но они также жестко кодируют имена таблиц и столбцов, а не используют имена классов и свойств.

Запросы JPQL уже проблематичны при рефакторинге, поскольку они жестко кодируют имена классов и свойств в строках. Но нативные запросы еще хуже, потому что они жестко кодируют имена таблиц и столбцов везде.

Я не думаю, что собственные запросы выбора являются проблемой, связанной с кешем. Тем не менее, собственные запросы на обновление, вставку и удаление являются проблемой, поскольку они изменяют данные за задним краем кэша первого и второго уровня. Так что они могут устареть.

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

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