2010-12-09 4 views
57

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

Я прочитал это в другой anwers

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

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

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

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

ответ

2

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

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

JPA and Hibernate - Criteria vs. JPQL or HQL

+2

Критерии могут выполнять большинство типов соединений, которые может выполнять HQL, хотя иногда это немного неудобно или трудно понять (по крайней мере, на мой взгляд). Абсолютно верно о том, что HQL легче читать! – 2011-01-22 21:00:32

+1

BTW, я бы проголосовал за ваш ответ ... но вы не ответили на вопрос kcobuntu. – 2011-01-22 21:01:54

+23

Если вы собираетесь копировать чужой ответ, вы должны хотя бы упомянуть об этом. Ссылка на исходный ответ: http://stackoverflow.com/a/197496/980103 – 2014-03-05 12:26:49

124

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

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

Таким образом, с точки зрения накладных расходов SQL поколения мы имеем:

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

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

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

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

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

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

3

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

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

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

1

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

Смежные вопросы