package com.hantsylabs.example.spring.jpa.spec; import java.sql.Timestamp; import java.util.Date; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import org.springframework.data.jpa.domain.Specification; import com.hantsylabs.example.spring.model.Conference; public class JpaSpecs { public static Specification<Conference> inProgressConferences() { return new Specification<Conference>() { @Override public Predicate toPredicate(Root<Conference> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Expression<Timestamp> currentTimestamp = cb.currentTimestamp(); return cb.and( cb.greaterThan(root.get("endedDate").as(Date.class), currentTimestamp), cb.lessThan( root.get("startedDate").as(Date.class), currentTimestamp)); } }; } public static Specification<Conference> pastConferences(final Date past) { return new Specification<Conference>() { @Override public Predicate toPredicate(Root<Conference> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Expression<Timestamp> currentTimestamp = cb.currentTimestamp(); if (past == null) { return cb.greaterThan(currentTimestamp, root.get("endedDate").as(Date.class)); } else { return cb.and(cb.greaterThan(currentTimestamp, root.get("endedDate").as(Date.class)), cb .greaterThan( root.get("startedDate").as(Date.class), past)); } } }; } public static Specification<Conference> upcomingConferences() { return new Specification<Conference>() { @Override public Predicate toPredicate(Root<Conference> root, CriteriaQuery<?> query, CriteriaBuilder cb) { return cb.greaterThan(root.get("startedDate").as(Date.class), cb.currentTimestamp()); } }; } }