Всегда ли HQL-запрос попадает в базу данных и получает результаты?



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



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



Любезно посоветуйте об этом, поскольку я немного запутался в ситуации.



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

807   2  

2 ответов:

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.