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

Hibernate Criteria vs HQL: что быстрее?

Я читал несколько анверов, но я все еще смущен. Зачем? потому что различия, которые вы упомянули, не связаны с производительностью. они связаны с легким использованием. (Objetc (критерии) и SQL (hql)). Но я хотел бы знать, почему "критерии" медленнее hql по какой-то причине.

Я читал это в другом андреве

"Существует различие в показателях производительности между HQL и критериемQuery, каждый раз, когда вы запускаете запрос с использованием критерияQuery, он создает новый псевдоним для имени таблицы, который не отражается в последнем запрошенном кеше для любой БД. Это приводит к накладные расходы на компиляцию сгенерированного SQL, что требует больше времени для выполнения". Варуном Мехтой.

Это очень близко, НО! я читаю на другом веб-сайте (http://gary-rowe.com/agilestack/tag/hibernate/) Это больше не относится к Hibernate 3.3 и выше (пожалуйста, прочтите следующее: 9) Спящий режим медленный, потому что SQL, сгенерированный Интерфейс критериев не согласован)

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

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

4b9b3361

Ответ 1

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

Критерии, теоретически должны обладать меньшими накладными расходами, чем запрос HQL (за исключением именованных запросов, к которым я обращусь). Это потому, что Критериям не нужно ничего разбирать. Запросы HQL анализируются с помощью синтаксического анализа на основе ANTLR, а затем полученный AST превращается в SQL. Однако с помощью HQL/JPAQL вы можете определить именованные запросы, где SQL генерируется, когда Запускается SessionFactory. Теоретически, именованные запросы имеют меньше накладных расходов, чем критерии.

Итак, с точки зрения служебных данных SQL-поколения мы имеем:

  • Именованный запрос HQL/JPAQL - генерация SQL происходит только один раз.
  • Критерии. Не нужно разбираться перед генерацией.
  • (неименованный) запрос HQL/JPAQL - анализ и генерация.

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

Вот что я считаю при выборе между критериями и HQL/JPAQL:

  • Во-первых, вам нужно решить, согласны ли вы с тем, что в коде есть зависимость от Hibernate-proprietary API. JPA не имеет критериев.
  • Критерии действительно хороши при обработке многих необязательных параметров поиска, например, на обычной веб-странице с многопараметрической формой поиска. С помощью HQL разработчики склонны ссылаться на выражения where предложения с StringBuilder (избегать этого!). С критериями вам не нужно это делать. Хардик опубликовал похожие мнения.
  • HQL/JPAQL может использоваться для большинства других вещей, потому что код, как правило, меньше и проще для разработчиков.
  • Действительно, часто используемые запросы могут быть преобразованы в именованные запросы, если вы используете HQL. Я предпочитаю делать это позже, после некоторого профилирования.

Ответ 2

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

Если вы имеете дело с большим количеством данных, тогда перейдите на HQL.

Ответ 3

Другие преимущества Я думаю, для критериев по HQL:

Написание HQL делает код грязным. Это не похоже на то, чтобы писать чистый объектно-ориентированный код.

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

Ответ 4

Я предпочитаю запросы Criteria для динамических запросов. Например, гораздо проще добавить некоторый порядок динамически или оставить некоторые части (например, ограничения) в зависимости от некоторого параметра.

С другой стороны, я использую HQL для статических и сложных запросов, потому что это намного легче понять/прочитать HQL. Кроме того, HQL немного более мощный, я думаю, например. для разных типов соединений.

JPA и Hibernate - критерии против JPQL или HQL

Ответ 5

Вы правы, а нет. Список результатов извлекается из базы данных или кеша с классом org.hibernate.loader.Loader. Когда кеш не включен, подготовленный оператор создается с использованием объекта Dialect, который создается в SessionFactoryImp. Таким образом, заявления либо инициализируются для вызова списка. Кроме того, запрос низкого уровня генерируется автоматически. В принципе, это помощь, но может быть случай, когда конкретный запрос будет более эффективным при написании вручную.