[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-hibernate-chto-takoe-query-cache":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},1034,"chto-takoe-query-cache",19,"hibernate","Hibernate","🐻","Что такое Query Cache?","Query Cache — кэш результатов JPQL\u002FHQL-запросов. Хранит не данные сущностей, а список ID, возвращённых запросом с определёнными параметрами.\n\n### Как работает\n\n```\nКлюч кэша: запрос + параметры\nЗначение: список ID сущностей\n\nПри чтении: Query Cache → получить ID → L2 Cache → получить данные по ID → (если нет в L2 → БД)\n```\n\n### Настройка\n\n```properties\nspring.jpa.properties.hibernate.cache.use_query_cache=true\n```\n\n```java\n\u002F\u002F JPQL с кэшированием\nList\u003CUser> users = entityManager.createQuery(\n        \"SELECT u FROM User u WHERE u.status = :status\", User.class)\n    .setParameter(\"status\", UserStatus.ACTIVE)\n    .setHint(\"org.hibernate.cacheable\", true)\n    .getResultList();\n\n\u002F\u002F Spring Data JPA\n@QueryHints(@QueryHint(name = \"org.hibernate.cacheable\", value = \"true\"))\n@Query(\"SELECT u FROM User u WHERE u.status = :status\")\nList\u003CUser> findByStatus(@Param(\"status\") UserStatus status);\n```\n\n### Важное\n\n- Query Cache хранит список ID, а не данные — работает в связке с L2 Cache\n- Query Cache инвалидируется при любом изменении таблицы, участвующей в запросе\n- Эффективен только для запросов, которые выполняются часто с одинаковыми параметрами\n- Без L2 Cache — Query Cache бесполезен (ID есть, но данные придётся загружать из БД)\n\n### Частые ошибки\n\n- Включать Query Cache без L2 Cache — получив список ID из Query Cache, Hibernate пойдёт за каждой сущностью в БД (хуже, чем без кэша)\n- Кэшировать запросы к часто обновляемым таблицам — любой UPDATE\u002FINSERT\u002FDELETE инвалидирует весь Query Cache для этой таблицы\n- Кэшировать все запросы подряд — Query Cache полезен только для стабильных данных с повторяющимися параметрами\n\n### Как используется в 2026\n\n- Query Cache — нишевый инструмент, используется реже L2 Cache\n- Для большинства задач кэширования на уровне запросов — Spring Cache + Redis\n- Query Cache оправдан для тяжёлых аналитических запросов к неизменяемым данным\n\n> **На собеседовании:** покажите, что понимаете связку Query Cache + L2 Cache. Без L2 Cache включать Query Cache бессмысленно и даже вредно. Подчеркните, что Query Cache инвалидируется при любом изменении таблицы — это делает его бесполезным для часто обновляемых данных.","","senior",[15,16,17,7,18],"performance","jpa","query-cache","caching",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":35,"featuredSnippetReady":36},"Что такое Query Cache в Hibernate — Gymterview","Query Cache хранит список ID результатов JPQL\u002FHQL-запросов. Работает в связке с L2 Cache. Инвалидируется при любом изменении таблицы. Настройка.","Query Cache: кэширование результатов JPQL-запросов в Hibernate — Gymterview","Query Cache хранит список ID, работает в связке с L2 Cache. Без L2 Cache бесполезен. Инвалидируется при любом UPDATE таблицы.",[27,28,29,30,31,32,8,33,34],"Query Cache","кэш запросов","JPQL","HQL","L2 Cache","cacheable","инвалидация","JPA","Query Cache — кэш результатов JPQL\u002FHQL-запросов в Hibernate. Хранит не данные, а список ID сущностей. Ключ: запрос + параметры. Работает в связке с L2 Cache: получает ID из Query Cache, затем данные из L2 Cache. Без L2 Cache бесполезен. Инвалидируется при любом изменении таблицы, участвующей в запросе.",true]