Подтвердить что ты не робот

Что использовать: JPQL или API критериев?

В моем приложении Java используется JPA для сохранения объекта. Бизнес-домен очень прост (всего три класса являются постоянными, по 3-5 свойств в каждом). Запросы просты. Вопрос в том, какой подход я должен использовать: JPQL или API критериев?

4b9b3361

Ответ 1

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

  • Я нахожу запросы JPQL более легкими для записи/чтения.
  • Я нахожу API критериев доступным для создания динамических запросов.

Это в основном то, что вы найдете в Hibernate: Criteria vs. HQL.

Но есть одно существенное различие между API-интерфейсом JPA 2.0 и API-интерфейсом Hibernate, который стоит упомянуть: API-интерфейс API JPA 2.0 - это API-интерфейс типов и, таким образом, дает проверку времени компиляции, завершение кода, лучшую поддержку рефакторинга и т.д. Тем не менее, я не считаю, что преимущества перевешивают простоту использования JPQL.

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

Связанные вопросы

Дополнительные ресурсы

Ответ 2

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

Существует API-интерфейс Criteria, позволяющий создавать динамические SQL-запросы безопасным типом, который предотвращает SQL-инъекцию. В противном случае вы бы объединили строки SQL вместе, что связано как с ошибкой, так и с угрозой безопасности: например, SQL Injection. Это будет единственный раз, когда вы захотите использовать API критериев.

Если запрос остается в основном одинаковым, но нужно принимать только разные параметры, вы должны использовать аннотированные @NamedQueries, которые проще, предварительно скомпилированы, могут быть кэшированы в дополнительном кеше и, возможно, проверены во время запуска сервера.

Это в основном эмпирическое правило, касающееся запросов к критериям в сравнении с @NamedQueries. По моему опыту редко вам нужен API-интерфейс Criteria, но хорошо, что он существует для тех редких времен, в которых это требуется.

Надеюсь, что это поможет.

Ответ 3

Я думаю, вы также можете рассмотреть некоторые другие новые рамки вроде:

Запрос Dsl

Объектный запрос

Торпедный запрос

это дает вам безопасный и умный способ создания запросов, не является стандартным, но я уверен, что следующий стандарт будет основан на одной из этих технологий.

если вы хотите оставаться на стандартах, игнорируйте это.

до свидания