package dao.jpa; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import model.Author; import model.Book; import model.Category; import org.apache.commons.lang.StringUtils; import org.jdal.dao.Filter; import org.jdal.dao.jpa.JpaCriteriaBuilder; /** * Criteria Builder for Book Filter * * @author Jose Luis Martin - (jlm@joseluismartin.info) */ public class BookCriteriaBuilder implements JpaCriteriaBuilder<Book> { /** * {@inheritDoc} */ public CriteriaQuery<Book> build(CriteriaQuery<Book> criteria, CriteriaBuilder cb, Filter filter) { BookFilter f = (BookFilter) filter; Root<Book> root = criteria.from(Book.class); Path<Author> author = root.<Author>get("author"); Path<Category> category = root.<Category>get("category"); List<Predicate> predicates = new ArrayList<Predicate>(); if (StringUtils.isNotEmpty(f.getName())) predicates.add(cb.like(root.<String>get("name"), f.getName())); if (f.getCategory() != null) predicates.add(cb.equal(category.<String>get("name"), f.getCategory().getName())); if (f.getBefore() != null) predicates.add(cb.lessThanOrEqualTo(root.<Date>get("publishedDate"), f.getBefore())); if (f.getAfter() != null) predicates.add(cb.greaterThanOrEqualTo(root.<Date>get("publishedDate"), f.getAfter())); if (StringUtils.isNotEmpty(f.getAuthorName())) predicates.add(cb.like(author.<String>get("name"), f.getAuthorName())); if (StringUtils.isNotEmpty(f.getAuthorSurname())) predicates.add(cb.like(author.<String>get("surname"), f.getAuthorSurname())); if (StringUtils.isNotEmpty(f.getIsbn())) predicates.add(cb.like(root.<String>get("isbn"), f.getIsbn())); if (predicates.size() > 0) criteria.where(cb.and(predicates.toArray(new Predicate[]{}))); return criteria; } }