/**
* 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);
}
}