package pl.edu.icm.saos.persistence.search.implementor;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import pl.edu.icm.saos.persistence.search.dto.SearchFilter;
/**
* A {@link SearchImplementor} hql abstract implementation. It is recommended to use it as a base class for classes that perform specific paging searches using the hql query language.
*
* @author lukdumi
*
* @param <X> SearchFilter
* @param <T> Type of the searched object
*/
public abstract class AbstractJpqlSearchImplementor<X extends SearchFilter, T> extends AbstractStringQuerySearchImplementor<X, T> {
@PersistenceContext
private EntityManager entityManager;
@Override
protected List<T> executeQuery(String query, Map<String, Object> parametersMap, int first, int limit) {
if(parametersMap == null) {
parametersMap = Collections.emptyMap();
}
Query queryObject = entityManager.createQuery(query);
parametersMap.forEach(queryObject::setParameter);
queryObject.setMaxResults(limit); // !!!won't work with join fetch!!!
queryObject.setFirstResult(first);
@SuppressWarnings("unchecked")
List<T> list = queryObject.getResultList();
return list;
}
@Override
protected long executeCountQuery(String query, Map<String, Object> parametersMap) {
return (Long)executeQuery(query, parametersMap, 0, 1).get(0);
}
//**** setters ***
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}