/* * Copyright 2013-2014 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.data.repository.support; import java.lang.reflect.Method; import java.util.Optional; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.util.MultiValueMap; /** * API to invoke (CRUD) methods on Spring Data repository instances independently of the base interface they expose. * Clients should check the availability of the methods before invoking them by using the methods of * {@link RepositoryInvocationInformation}. * * @author Oliver Gierke * @since 1.10 */ public interface RepositoryInvoker extends RepositoryInvocationInformation { /** * Invokes the method equivalent to {@link org.springframework.data.repository.CrudRepository#save(Object)} on the * repository. * * @param object * @return the result of the invocation of the save method * @throws IllegalStateException if the repository does not expose a save method. */ <T> T invokeSave(T object); /** * Invokes the method equivalent to {@link org.springframework.data.repository.CrudRepository#findById(Object)}. * * @param id must not be {@literal null}. * @return the entity with the given id. * @throws IllegalStateException if the repository does not expose a find-one-method. */ <T> Optional<T> invokeFindById(Object id); /** * Invokes the find-all method of the underlying repository using the method taking a {@link Pageable} as parameter if * available (i.e. the equivalent to * {@link org.springframework.data.repository.PagingAndSortingRepository#findAll(Pageable)}), using the method taking * a {@link Sort} if available (i.e. the equivalent to * {@link org.springframework.data.repository.PagingAndSortingRepository#findAll(Sort)} by extracting the {@link Sort} * contained in the given {@link Pageable}) or the plain equivalent to * {@link org.springframework.data.repository.CrudRepository#findAll()}. * * @param pageable can be {@literal null}. * @return the result of the invocation of the find-all method. * @throws IllegalStateException if the repository does not expose a find-all-method. */ Iterable<Object> invokeFindAll(Pageable pageable); /** * Invokes the find-all method of the underlying repository using the method taking a {@link Sort} as parameter if * available (i.e. the equivalent to * {@link org.springframework.data.repository.PagingAndSortingRepository#findAll(Sort)}) or the plain equivalent to * {@link org.springframework.data.repository.CrudRepository#findAll()}. * * @param pageable can be {@literal null}. * @return the result of the invocation of the find-all method. * @throws IllegalStateException if the repository does not expose a find-all-method. */ Iterable<Object> invokeFindAll(Sort sort); /** * Invokes the method equivalent to {@link org.springframework.data.repository.CrudRepository#deleteById(Object)}. The * given id is assumed to be of a type convertible into the actual identifier type of the backing repository. * * @param id must not be {@literal null}. * @throws {@link IllegalStateException} if the repository does not expose a delete-method. */ void invokeDeleteById(Object id); /** * Invokes the query method backed by the given {@link Method} using the given parameters, {@link Pageable} and * {@link Sort}. * * @param method must not be {@literal null}. * @param parameters must not be {@literal null}. * @param pageable must not be {@literal null}. * @param sort must not be {@literal null}. * @return the result of the invoked query method. * @since 1.11 */ Optional<Object> invokeQueryMethod(Method method, MultiValueMap<String, ? extends Object> parameters, Pageable pageable, Sort sort); }