001    
002    /*
003     * Copyright (C) 2011 Archie L. Cobbs. All rights reserved.
004     *
005     * $Id: CriteriaCallback.java 276 2012-02-13 22:19:35Z archie.cobbs $
006     */
007    
008    package org.dellroad.stuff.dao;
009    
010    import javax.persistence.EntityManager;
011    import javax.persistence.TypedQuery;
012    import javax.persistence.criteria.CriteriaBuilder;
013    import javax.persistence.criteria.CriteriaQuery;
014    
015    /**
016     * Specialization of {@link QueryCallback} for {@link CriteriaQuery} queries.
017     *
018     * @param <T> persistent instance type
019     * @param <R> query return type
020     */
021    public abstract class CriteriaCallback<T, R> extends TypedQueryCallback<T, R> {
022    
023        protected final Class<T> type;
024    
025        protected CriteriaCallback(Class<T> type) {
026            if (type == null)
027                throw new IllegalArgumentException("null type");
028            this.type = type;
029        }
030    
031        /**
032         * Build the query by delegating to {@link #configureQuery configureQuery()} for configuration.
033         */
034        @Override
035        protected final TypedQuery<T> buildQuery(EntityManager entityManager) {
036            CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
037            CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(this.type);
038            this.configureQuery(criteriaQuery, criteriaBuilder);
039            return entityManager.createQuery(criteriaQuery);
040        }
041    
042        /**
043         * Configure the {@link CriteriaQuery}.
044         */
045        protected abstract void configureQuery(CriteriaQuery<T> criteriaQuery, CriteriaBuilder criteriaBuilder);
046    }
047