/*
* Copyright 2002-2016 the original author or authors.
*
* Licensed 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.springframework.integration.jpa.core;
import java.util.List;
import javax.persistence.EntityManager;
import org.springframework.integration.jpa.support.parametersource.ParameterSource;
/**
* The Interface containing all the JpaOperations those will be executed by
* the Jpa Spring Integration components.
*
* @author Amol Nayak
* @author Gunnar Hillert
* @since 2.2
*
*/
public interface JpaOperations {
/**
*
* @param entity The entity to delete.
*/
void delete(Object entity);
/**
*
* @param entities The entities to delete.
*/
void deleteInBatch(Iterable<?> entities);
/**
* Executes the given update statement and uses the given parameter source to
* set the required query parameters.
*
* @param updateQuery Must Not be empty.
* @param source Must Not be null.
* @return The number of entities updated
*/
int executeUpdate(String updateQuery, ParameterSource source);
/**
*
* @param updateQuery The update query.
* @param source The parameter source.
* @return The number of entities updated.
*/
int executeUpdateWithNamedQuery(String updateQuery, ParameterSource source);
/**
*
* @param updateQuery The update query.
* @param source The parameter source.
* @return The number of entities updated
*/
int executeUpdateWithNativeQuery(String updateQuery, ParameterSource source);
/**
* Find an Entity of given type with the given primary key type.
*
* @param <T> The type to return.
* @param entityType The type.
* @param id The object identifier.
* @return The entity if it exists, null otherwise.
*/
<T> T find(Class<T> entityType, Object id);
/**
*
* @param entityClass The entity class.
* @param firstResult The index of the first result to return.
* @param maxNumberOfReturnedObjects The number of objects to return.
* @return The list of found entities.
*/
List<?> getResultListForClass(Class<?> entityClass,
int firstResult,
int maxNumberOfReturnedObjects);
/**
*
* @param selectNamedQuery The select named query.
* @param jpaQLParameterSource The paramter source.
* @param firstResult The index of the first result to return.
* @param maxNumberOfResults The number of objects to return.
* @return The list of found entities.
*/
List<?> getResultListForNamedQuery(String selectNamedQuery, ParameterSource jpaQLParameterSource,
int firstResult,
int maxNumberOfResults);
/**
*
* @param selectQuery The select query.
* @param entityClass The entity class.
* @param jpaQLParameterSource The paramter source.
* @param firstResult The index of the first result to return.
* @param maxNumberOfResults The number of objects to return.
* @return The list of found entities.
*/
List<?> getResultListForNativeQuery(String selectQuery,
Class<?> entityClass, ParameterSource jpaQLParameterSource,
int firstResult,
int maxNumberOfResults);
/**
* Executes the provided query to return a list of results
* @param query The query.
* @param source the Parameter source for this query to be executed, if none then set as null
* @return The list of found entities.
*/
List<?> getResultListForQuery(String query, ParameterSource source);
/**
* Executes the provided query to return a list of results.
*
* @param query Must not be null or empty
* @param firstResult The first result.
* @param maxNumberOfResults Must be a non-negative value, any negative or zero will be ignored.
* @param source the Parameter source for this query to be executed, if none then set null.
* @return The list of found entities.
*/
List<?> getResultListForQuery(String query, ParameterSource source, int firstResult, int maxNumberOfResults);
/**
* Executes the provided query to return a single element
*
* @param query Must not be empty
* @param source the Parameter source for this query to be executed, if none then set as null
* @return Will always return a result. If no object was found in the database an exception is raised.
*/
Object getSingleResultForQuery(String query, ParameterSource source);
/**
* The entity to be merged with the {@link EntityManager}. The provided object can
* also be an {@link Iterable} in which case each object of the {@link Iterable}
* is treated as an entity and merged with the {@link EntityManager}. {@code Null}
* values returned while iterating over the {@link Iterable} are ignored.
*
* @param entity Must not be null.
* @return The merged managed instance of the entity.
*/
Object merge(Object entity);
/**
* The entity to be merged with the {@link EntityManager}. The provided object can
* also be an {@link Iterable} in which case each object of the {@link Iterable}
* is treated as an entity and merged with the {@link EntityManager}.
* In addition the {@link javax.persistence.EntityManager#flush()} is called after the merge
* and after each batch, as it is specified using {@code flushSize} parameter and if
* provided object is {@link Iterable}.
* {@code clearOnFlush}parameter specifies, if the {@link javax.persistence.EntityManager#clear()}
* should be called after each {@link javax.persistence.EntityManager#flush()}.
*
* @param entity The entity.
* @param flushSize The flush size.
* @param clearOnFlush true to clear after flushing.
* @return The merged object.
*/
Object merge(Object entity, int flushSize, boolean clearOnFlush);
/**
* Persists the entity. The provided object can also be an {@link Iterable}
* in which case each object of the {@link Iterable} is treated as an entity
* and persisted with the {@link EntityManager}. {@code Null} values returned
* while iterating over the {@link Iterable} are ignored.
*
* @param entity Must not be null
*
*/
void persist(Object entity);
/**
* Persists the entity. The provided object can also be an {@link Iterable}
* in which case each object of the {@link Iterable} is treated as an entity
* and persisted with the {@link EntityManager}. {@code Null} values returned
* while iterating over the {@link Iterable} are ignored.
* In addition the {@link javax.persistence.EntityManager#flush()} is called after the persist
* and after each batch, as it is specified using {@code flushSize} parameter and if
* provided object is {@link Iterable}.
* {@code clearOnFlush}parameter specifies, if the {@link javax.persistence.EntityManager#clear()}
* should be called after each {@link javax.persistence.EntityManager#flush()}.
*
* @param entity The entity.
* @param flushSize The flush size.
* @param clearOnFlush true to clear after flushing.
*/
void persist(Object entity, int flushSize, boolean clearOnFlush);
/**
* Executes {@link javax.persistence.EntityManager#flush()}.
*/
void flush();
}