В моем приложении Java используется JPA для сохранения объекта. Бизнес-домен очень прост (всего три класса являются постоянными, по 3-5 свойств в каждом). Запросы просты. Вопрос в том, какой подход я должен использовать: JPQL или API критериев?
Что использовать: JPQL или API критериев?
Ответ 1
Я уверен, что это уже было описано здесь, но я не мог найти существующий вопрос. Итак, вот моя точка зрения на вопрос:
- Я нахожу запросы JPQL более легкими для записи/чтения.
- Я нахожу API критериев доступным для создания динамических запросов.
Это в основном то, что вы найдете в Hibernate: Criteria vs. HQL.
Но есть одно существенное различие между API-интерфейсом JPA 2.0 и API-интерфейсом Hibernate, который стоит упомянуть: API-интерфейс API JPA 2.0 - это API-интерфейс типов и, таким образом, дает проверку времени компиляции, завершение кода, лучшую поддержку рефакторинга и т.д. Тем не менее, я не считаю, что преимущества перевешивают простоту использования JPQL.
Подводя итог, я бы предпочел JPQL, за исключением динамических запросов (например, для функций поиска с несколькими критериями).
Связанные вопросы
- Спящий режим: критерии против HQL
- Что представляет собой пример реального мира, где более предпочтительным API-интерфейсом JPA2?
Дополнительные ресурсы
Ответ 2
Я ответил на аналогичный вопрос ранее, и я снова отправлю свой ответ здесь для пользы сообщества. Я предполагаю, что вы используете сервер приложений по сравнению с моим ответом ниже.
Существует API-интерфейс Criteria, позволяющий создавать динамические SQL-запросы безопасным типом, который предотвращает SQL-инъекцию. В противном случае вы бы объединили строки SQL вместе, что связано как с ошибкой, так и с угрозой безопасности: например, SQL Injection. Это будет единственный раз, когда вы захотите использовать API критериев.
Если запрос остается в основном одинаковым, но нужно принимать только разные параметры, вы должны использовать аннотированные @NamedQueries, которые проще, предварительно скомпилированы, могут быть кэшированы в дополнительном кеше и, возможно, проверены во время запуска сервера.
Это в основном эмпирическое правило, касающееся запросов к критериям в сравнении с @NamedQueries. По моему опыту редко вам нужен API-интерфейс Criteria, но хорошо, что он существует для тех редких времен, в которых это требуется.
Надеюсь, что это поможет.
Ответ 3
Я думаю, вы также можете рассмотреть некоторые другие новые рамки вроде:
это дает вам безопасный и умный способ создания запросов, не является стандартным, но я уверен, что следующий стандарт будет основан на одной из этих технологий.
если вы хотите оставаться на стандартах, игнорируйте это.
до свидания