Всегда ли HQL-запрос попадает в базу данных и получает результаты?
Я проходил через hibernate и ситуации, когда использовать Criteria vs HQL , и мое понимание заключается в том, что с Hibernate, каждый раз, когда мы запрашиваем базу данных либо по Criteria, либо по HQL в обоих случаях hibernate получит результирующий набор и помещается в память, а затем, когда мы снова вызовем этот запрос, данные будут извлечены из памяти, а не попали в эту базу данных, правильно ли мое понимание?
Также, как вы можете видеть из комментариев к вопросу, упомянутому ниже, было предложено, чтобы Hibernate Критерии будут получать данные из сеанса, и HQL всегда будет идти и попадать в базу данных, и поэтому любое количество многократных вызовов запроса HQL будет идти и попадать в базу данных, и если это так, то HQL вызывает больше проблем, чем решение.
Любезно посоветуйте об этом, поскольку я немного запутался в ситуации.
Ссылка на Вопрос
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