Всегда ли HQL-запрос попадает в базу данных и дает результаты? - PullRequest
6 голосов
/ 24 января 2012

Я проходил через hibernate и ситуации, когда использовать Criteria vs HQL, и я понимаю, что с Hibernate каждый раз, когда мы запрашиваем базу данных либо по Criteria, либо HQL, в обоих случаях hibernate получит набор результатов и поместит их впамять, а затем, когда мы снова вызываем этот запрос, данные будут извлекаться из памяти, а не попадать в эту базу данных, верно ли мое понимание?

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

Пожалуйста, сообщите об этом, так как я немного запутался в ситуации.

Ссылка на вопрос

Ответы [ 2 ]

7 голосов
/ 24 января 2012

Это зависит от того, какие запросы вы делаете, и от настроек кеша.

Hibernate имеет три вида кешей: кеш сессии, кеш запросов и кэш 2-го уровня.Кэш сеанса всегда включен, но два других можно отключить.

Обычно кэширование не является причиной для предпочтения Criteria API по сравнению с HQL или наоборот.В основном это просто разные интерфейсы, по сути, одно и то же.

См. http://www.javalobby.org/java/forums/t48846.html и http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

1 голос
/ 24 января 2012

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

Запросы Hibernate (используете ли вы Criteria или HQL) будут возвращать сущности только из кеша сеанса (кеша первого уровня), если вы получили его с @ Id.

Для кеширования запроса вы можете использовать следующий синтаксис:

session.createQuery("from X as x").setCacheable(true);

Отредактировано для комментариев:

Запрос не совпадает с запросом @Id. Чтобы получить объект по его @Id, вы должны написать что-то вроде:

Entity myEntity = sessionFactory.getCurrentSession().get(Entity.class, 1);
...