Can the same CriteriaBuilder (JPA 2) instance be used to create multiple queries?

criteria-api, java, jpa, jpa-2.0

Solution

Reading the javadoc in section 3.1.1 EntityManager Interface of the JPA 2.0 specification (JSR 317):

/**
 * Return an instance of CriteriaBuilder for the creation of
 * CriteriaQuery objects.
 * @return CriteriaBuilder instance
 * @throws IllegalStateException if the entity manager has
 *         been closed
 */
public CriteriaBuilder getCriteriaBuilder();

And this comment just after:

The `Query`, `TypedQuery`, `CriteriaBuilder`, `Metamodel`, and `EntityTransaction` objects obtained from an entity manager are valid while that entity manager is open.

And the section 6.5 Constructing Criteria Queries

The `CriteriaBuilder` interface is used to construct `CriteriaQuery` objects. The `CriteriaBuilder` implementation is accessed through the `getCriteriaBuilder` method of the `EntityManager` or `EntityManagerFactory` interface.

I expect being able to reuse a single `CriteriaBuilder` to create many queries for the lifetime of the entity manager. But that's my interpretation. However, my initial testing seems to confirm there is nothing wrong with that (the contrary would be indeed horrible).

Problem

This seems like a pretty simple question, but I have not managed to find a definitive answer yet. I have a DAO class, which is naturally querying the database by using criteria queries. So I would like to know if it is safe to use the same CriteriaBuilder implementation for the creation of different queries or do I have to create new CriteriaBuilder instance for each query. Following code example should illustrate what I would like to do: ``` public class DAO() { CriteriaBuilder cb = null; public DAO() { cb = getEntityManager().getCriteriaBuilder(); } public List<String> getNames() { CriteriaQuery<String> nameSearch = cb.createQuery(String.class); ... } public List<Address> getAddresses(String name) { CriteriaQuery<Address> nameSearch = cb.createQuery(Address.class); ... } } ``` Is it ok to do this?

Original source

Related problems