2012-03-03 2 views
7

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

Моя философия избегала родных запросов, но наверняка бывают моменты, когда они необходимы. Мне кажется, что если я смогу это сделать с помощью JPQL или CriteriaBuilder, тогда я должен это сделать.

Спасибо.

ответ

12

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

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

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

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

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

+0

Замечательное объяснение @JB Nizet как всегда. Вопрос также задает вопрос о построении критериев. Я понимаю, что запросы Criteria полезны для поддержания безопасности типов (что JPQL не предоставляет, как указано в вашем ответе). Тем не менее, я лично считаю API критериев очень громоздким и трудночитаемым. Существуют ли другие преимущества API Критерии над JPQL? – HopeKing

+1

Я также нахожу этот API очень громоздким и неинтуитивным для использования и труднее читать. Я использую этот API только в том случае, когда мне нужно составлять запрос динамически на основе ... критериев (отсюда и название API). Например, когда пользователь отправляет форму поиска с несколькими необязательными критериями (имя, имя, минимальная дата, максимальная дата рождения и т. Д.), Различные элементы предложения должны быть добавлены или нет в зависимости от наличия или отсутствия этих критериев. –

+0

К пункту и очень ясно. Благодарю. – HopeKing