/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.jpa; import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.Set; import javax.persistence.EntityManager; import javax.persistence.Query; /** * A builder of query expressions * * @version */ public abstract class QueryBuilder implements QueryFactory { ParameterBuilder parameterBuilder; /** * Creates a query builder using the JPA query syntax * * @param query JPA query language to create * @return a query builder */ public static QueryBuilder query(final String query) { return new QueryBuilder() { protected Query makeQueryObject(EntityManager entityManager) { return entityManager.createQuery(query); } @Override public String toString() { return "Query: " + query + getParameterDescription(); } }; } /** * Creates a named query */ public static QueryBuilder namedQuery(final String namedQuery) { return new QueryBuilder() { protected Query makeQueryObject(EntityManager entityManager) { return entityManager.createNamedQuery(namedQuery); } @Override public String toString() { return "Named: " + namedQuery + getParameterDescription(); } }; } /** * Creates a native SQL query */ public static QueryBuilder nativeQuery(final String nativeQuery) { return new QueryBuilder() { protected Query makeQueryObject(EntityManager entityManager) { return entityManager.createNativeQuery(nativeQuery); } @Override public String toString() { return "NativeQuery: " + nativeQuery + getParameterDescription(); } }; } /** * Creates a native SQL query with a provided resultClass */ public static QueryBuilder nativeQuery(final String nativeQuery, final Class<?> resultClass) { return new QueryBuilder() { protected Query makeQueryObject(EntityManager entityManager) { return entityManager.createNativeQuery(nativeQuery, resultClass); } @Override public String toString() { return "NativeQuery: " + nativeQuery + " resultClass:" + resultClass + getParameterDescription(); } }; } /** * Specifies the parameters to the query * * @param parameters the parameters to be configured on the query * @return this query builder */ public QueryBuilder parameters(Object... parameters) { return parameters(Arrays.asList(parameters)); } /** * Specifies the parameters to the query as an ordered collection of * parameters * * @param parameters the parameters to be configured on the query * @return this query builder */ public QueryBuilder parameters(final Collection<?> parameters) { checkNoParametersConfigured(); parameterBuilder = new ParameterBuilder() { public void populateQuery(EntityManager entityManager, Query query) { int counter = 0; for (Object parameter : parameters) { query.setParameter(counter++, parameter); } } @Override public String toString() { return "Parameters: " + parameters; } }; return this; } /** * Specifies the parameters to the query as a Map of key/value pairs * * @param parameterMap the parameters to be configured on the query * @return this query builder */ public QueryBuilder parameters(final Map<String, Object> parameterMap) { checkNoParametersConfigured(); parameterBuilder = new ParameterBuilder() { public void populateQuery(EntityManager entityManager, Query query) { Set<Map.Entry<String, Object>> entries = parameterMap.entrySet(); for (Map.Entry<String, Object> entry : entries) { query.setParameter(entry.getKey(), entry.getValue()); } } @Override public String toString() { return "Parameters: " + parameterMap; } }; return this; } protected void checkNoParametersConfigured() { if (parameterBuilder != null) { throw new IllegalArgumentException("Cannot add parameters to a QueryBuilder which already has parameters configured"); } } public Query createQuery(EntityManager entityManager) { Query query = makeQueryObject(entityManager); populateQuery(entityManager, query); return query; } protected String getParameterDescription() { if (parameterBuilder == null) { return ""; } else { return " " + parameterBuilder.toString(); } } protected void populateQuery(EntityManager entityManager, Query query) { if (parameterBuilder != null) { parameterBuilder.populateQuery(entityManager, query); } } protected abstract Query makeQueryObject(EntityManager entityManager); /** * A plugin strategy to populate the query with parameters */ protected abstract static class ParameterBuilder { public abstract void populateQuery(EntityManager entityManager, Query query); } }