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