Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Hibernate Tip: Use the QueryCache to Avoid Additional Queries [Video]

DZone's Guide to

Hibernate Tip: Use the QueryCache to Avoid Additional Queries [Video]

Hibernate's structure can pose query result caching problems for the uninitiated. Let's see how QueryCache solves the problem.

· Java Zone ·
Free Resource

Java-based (JDBC) data connectivity to SaaS, NoSQL, and Big Data. Download Now.

Hibernate Tips is a series of posts in which I describe a quick and easy solution for common Hibernate questions. If you have a question for a future Hibernate Tip, please leave a comment below.

Question

Hibernate does not use the first- and second-level for queries. Is there any way to cache the result of a query?

Solution

Hibernate also supports the QueryCache, which can store the result of a query. You need to activate it in the persistence.xml file by setting the parameter hibernate.cache.use_query_cache to true and defining a hibernate.cache.region.factory_class (see l. 12-13).

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="my-persistence-unit">
...

<properties>
...

<!--  configure caching -->
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
</properties>
</persistence-unit>
</persistence>


And you also need to activate caching for the specific query you want to cache the results of by calling the setCacheable of the Hibernate-specific Query interface with the parameter true.

Session s = (Session) em.getDelegate();
Query q = s.createQuery("SELECT a FROM Author a WHERE id = :id");
q.setParameter("id", 1L);
q.setCacheable(true);
log.info(q.uniqueResult());

And for more Hibernate recipes, check out my book Hibernate Tips: More than 70 solutions to common Hibernate problems.

Connect any Java based application to your SaaS data.  Over 100+ Java-based data source connectors.

Topics:
jpa ,hibernate ,querying ,caching ,java ,tutorial

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}