package jpasearch.repository;
import java.io.Serializable;
import java.util.List;
import javax.persistence.NonUniqueResultException;
import jpasearch.domain.Identifiable;
import jpasearch.repository.query.ResultParameters;
import jpasearch.repository.query.SearchParameters;
/**
* @author speralta
*
* @param <E>
* the entity type
* @param <PK>
* the entity's primary key type
*/
public interface GenericRepository<E extends Identifiable<PK>, PK extends Serializable> {
/**
* Find and load a list of E instance.
*
* @param searchParameters
* carries additional search information
* @return the entities matching the search.
*/
List<E> find(SearchParameters<E> searchParameters);
/**
* Count the number of E instances.
*
* @param searchParameters
* carries additional search information
* @return the number of entities matching the search.
*/
long findCount(SearchParameters<E> searchParameters);
/**
* Find a list of E property.
*
* @param searchParameters
* carries additional search information
* @param resultParameters
* carries result information
* @return the entities property matching the search.
*/
<T> List<T> findProperty(SearchParameters<E> searchParameters, ResultParameters<E, T> resultParameters);
/**
* Count the number of instances of the path.
*
* @param searchParameters
* carries additional search information
* @param resultParameters
* carries result information
* @return the number of entities matching the search.
*/
long findPropertyCount(SearchParameters<E> searchParameters, ResultParameters<E, ?> resultParameters);
/**
* Find and load a unique E instance.
*
* @param searchParameters
* carries additional search information
* @return the entity matching the search or null.
*/
E findUnique(SearchParameters<E> searchParameters);
/**
* We request at most 2, if there's more than one then we throw a
* {@link NonUniqueResultException}
*
* @param searchParameters
* carries additional search information
* @return the entity matching the search.
* @throws NonUniqueResultException
*/
E findUniqueOrNone(SearchParameters<E> searchParameters);
}