package eu.eudat.queryable.hibernatequeryablelist; import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.predicates.OrderByPredicate; import eu.eudat.queryable.predicates.SelectPredicate; import eu.eudat.queryable.predicates.SinglePredicate; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import java.util.LinkedList; import java.util.List; public class QueryableHibernateList implements QueryableList { private EntityManager manager; private CriteriaQuery query; private Class tClass; private Root root; private LinkedList predicates = new LinkedList(); private Integer length; private Integer offset; public QueryableHibernateList(EntityManager manager, Class tClass) { this.manager = manager; this.tClass = tClass; } public QueryableHibernateList setManager(EntityManager manager) { this.manager = manager; return this; } public QueryableHibernateList setEntity(Class type) { CriteriaBuilder builder = this.manager.getCriteriaBuilder(); this.query = builder.createQuery(type); this.root = this.query.from(this.tClass); return this; } public void initiateQueryableList(Class type) { CriteriaBuilder builder = this.manager.getCriteriaBuilder(); this.query = builder.createQuery(type); } @Override public QueryableList skip(Integer offset) { this.offset = offset; return this; } @Override public QueryableList take(Integer length) { this.length = length; return this; } public QueryableList where(SinglePredicate predicate) { this.predicates.add(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.root)); return this; } public List select(SelectPredicate predicate) { List list = this.toList(); List newlist = new LinkedList(); for (T item : list) { newlist.add(predicate.applySelection(item)); } return newlist; } public QueryableList distinct() { this.query.distinct(true); return this; } public QueryableList orderBy(OrderByPredicate predicate) { this.query.orderBy(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.root)); return this; } public List toList() { Predicate[] array = new Predicate[this.predicates.size()]; this.predicates.toArray(array); this.query.where(array); TypedQuery typedQuery = this.manager.createQuery(this.query); if(this.offset!=null)typedQuery.setFirstResult(this.offset); if(this.length!=null)typedQuery.setMaxResults(this.length); return typedQuery.getResultList(); } }