Spring Data JPA CriteriaBuilder против JPQL [дубликат]

Вы также можете сделать

result = ([ a for a,b in original ], [ b for a,b in original ])

Он должен масштабироваться лучше. Особенно, если Python делает все возможное, чтобы не расширять списки, если это не нужно.

(Кстати, это делает 2-кортежи (пары) списков, а не список кортежей, например zip).

Если генераторы вместо фактических списков в порядке, это будет делать следующее:

result = (( a for a,b in original ), ( b for a,b in original ))

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

61
задан Pascal Thivent 4 October 2010 в 21:19
поделиться

3 ответа

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

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

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

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

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

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

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

69
ответ дан Community 21 August 2018 в 22:25
поделиться
  • 1
    Извините за восстановление старого потока, но не следует JPQL избегать как можно больше. Не говоря о том, что использовать JPQL - это плохая практика, но я просто говорю, что если что-то можно сделать с использованием критериев, то это должно быть сделано с использованием JPQL. Я просто смиренно ищу больше разъяснений от вас, ставя под сомнение ваше предпочтение JPQL по критериям. – Shahzeb 2 March 2012 в 01:07
  • 2
    @Shahzeb Нет, абсолютно нет. Не используйте критерии API для чего-либо статического - т. Е. Если можно написать запрос как JPQL во время компиляции, то yoh должен использовать JPQL. Разумеется, не в форме струн, которые посыпаются в коде, этого следует избегать; но как именованные запросы. Те обрабатываются во время запуска и даже во время редактирования некоторыми IDE. – Hauke Ingmar Schmidt 3 August 2012 в 16:45

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

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

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

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

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

4
ответ дан sagneta 21 August 2018 в 22:25
поделиться

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

Query Dsl

Object Query

Torpedo Query

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

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

bye

-3
ответ дан tglman 21 August 2018 в 22:25
поделиться
  • 1
    Это не имеет никакого отношения к вопросу о том, что лучше и должно было только что было добавлено в качестве комментария к первому вопросу – Adrian Legaspi 7 February 2018 в 11:47
Другие вопросы по тегам:

Похожие вопросы: