✅ Short Answer
You can cache query results in Hibernate by:
1️⃣ Enabling the query cache in your Hibernate configuration.
2️⃣ Marking individual queries as cacheable with .setCacheable(true)
.
This allows Hibernate to store entire result sets in the second-level cache, speeding up repeated queries.
🔎 Detailed Explanation
🔹 1) Enable the Query Cache Globally
In your Hibernate config (e.g., hibernate.cfg.xml
or application.properties
):
hibernate.cache.use_query_cache=true
✅ Note: Query cache depends on second-level cache → it won’t work without it.
🔹 2) Mark Specific Queries as Cacheable
When building your query, call:
Query<MyEntity> query = session.createQuery("FROM MyEntity WHERE status = :status", MyEntity.class);
query.setParameter("status", "ACTIVE");
query.setCacheable(true); // enables caching of this query's result set
List<MyEntity> results = query.getResultList();
✅ Hibernate caches the list of entity IDs matching the query + the entities themselves in the second-level cache.
🔹 3) (Optional) Set Cache Region
You can group cached queries in regions with different settings:
query.setCacheRegion("myQueryCacheRegion");
🔹 4) Important Behavior
- If you update any entity in the result set, Hibernate invalidates the cached query → ensures consistency.
- Query cache does not cache individual entities — it only caches the query result (IDs) → entities themselves must be second-level cache-enabled.
🧑💻 Practical Example
List<Product> products = session.createQuery(
"FROM Product p WHERE p.category = :category", Product.class)
.setParameter("category", "Books")
.setCacheable(true)
.getResultList();
📊 Benefits of Query Cache
✅ Useful for expensive, frequently repeated queries (e.g., top 10 products, homepage listings).
✅ Reduces DB load when the same result set is requested often.
⚠️ Pitfalls
❌ Not helpful for highly dynamic queries → too many cache entries → bloated cache.
❌ Query cache must be combined with second-level entity caching → otherwise it can’t serve objects efficiently.
📌 Key Takeaways
✅ To cache query results:
- Enable
hibernate.cache.use_query_cache
. - Call
.setCacheable(true)
on your query.
✅ The query cache speeds up repeated queries by storing result sets, not entities themselves.
✅ Always ensure entity second-level caching is configured → query cache works hand-in-hand with it.