package au.com.vaadinutils.criteriadelegate; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.persistence.metamodel.SingularAttribute; import au.com.vaadinutils.crud.CrudEntity; /** * this class is intended to be used in a QueryModifierDelegate, as a builder to * build a query using the provided query stub * <p> * example usage... * <p> * CriterBuilder<Tblcallrecord> builder = new * CriterBuilder<Tblcallrecord>(criteriaBuilder, (CriteriaQuery<Tblcallrecord>) * query, predicates); * <p> * * builder.join(Tblcallrecord_.account, JoinType.LEFT)<br> * .where(<br> * builder.and(<br> * builder.and(<br> * builder.equals( Tblcallrecord_.vSource, "400"), <br> * builder.equals(Tblcallrecord_.account, Account_.login, "100")),<br> * builder.like(Tblcallrecord_.uniqueCallId, "%497%")))<br> * .build(); * * * @author rsutton * * @param <E> */ public class CriterBuilder<E extends CrudEntity> { Root<E> entityRoot = null; private CriteriaBuilder criteriaBuilder; private CriteriaQuery<E> query; // private List<Predicate> predicates; private Map<Class<?>, Join<E, ?>> joins = new HashMap<Class<?>, Join<E, ?>>(); private Conditional<E, ?> conditional; @SuppressWarnings("unchecked") public CriterBuilder(CriteriaBuilder criteriaBuilder, CriteriaQuery<E> query, List<Predicate> predicates) { this.criteriaBuilder = criteriaBuilder; this.query = query; // this.predicates = predicates; entityRoot = (Root<E>) query.getRoots().iterator().next(); } public CriterBuilder<E> join(SingularAttribute<E, ?> joinColumn, JoinType joinType) { Join<E, ?> join = entityRoot.join(joinColumn, joinType); joins.put(joinColumn.getBindableJavaType(), join); return this; } public <K> CriterBuilder<E> where(Conditional<E, K> cond) { this.conditional = cond; return this; } public <K> Conditional<E, K> and(Conditional<E, K> arg1, Conditional<E, K> arg2) { return new And<E, K>(arg1, arg2); } public <K> Conditional<E, K> or(Conditional<E, K> arg1, Conditional<E, K> arg2) { return new Or<E, K>(arg1, arg2); } @SuppressWarnings("unchecked") public <K> Conditional<E, K> equals(SingularAttribute<E, K> arg1, K arg2) { return (Conditional<E, K>) new Equals<E, K>(arg1, arg2); } @SuppressWarnings("unchecked") public <JOIN extends CrudEntity> Conditional<E, String> like(SingularAttribute<E, String> arg1, String arg2) { return (Conditional<E, String>) new Like<E, JOIN>(arg1, arg2); } public void build() { if (conditional != null) { query.where(conditional.getPredicate(this, criteriaBuilder, joins)); } } }