Close

JPA Criteria API - CriteriaBuilder Date Time Operations

[Last Updated: Aug 11, 2020]

The following methods of CriteriaBuilder can be used for date/time/timestamp operations:

package javax.persistence.criteria;
 ........
public interface CriteriaBuilder {
    ........
    //Create expression to return current date.
    Expression<java.sql.Date> currentDate();

    //Create expression to return current timestamp.
    Expression<java.sql.Timestamp> currentTimestamp();

    //Create expression to return current time.
    Expression<java.sql.Time> currentTime();
	........
}

Also check out JPQL date time functions.

Example

Entity

@Entity
public class ScheduledEvent {
    @Id
    @GeneratedValue
    private long id;
    private String eventName;
    private Date date;
    private Time start;
    private Time end;
    private Timestamp eventCreated;
    .............
}

Performing date time operations

public class ExampleMain {
    private static EntityManagerFactory entityManagerFactory =
            Persistence.createEntityManagerFactory("example-unit");

    public static void main(String[] args) {
        try {
            persistEvent();
            findCurrentEvent();
            findTodayEvent();
            findEventCreatedNow();
        } finally {
            entityManagerFactory.close();
        }
    }

    private static void findCurrentEvent() {
        System.out.println("-- current ongoing event  --");
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<ScheduledEvent> query = criteriaBuilder.createQuery(ScheduledEvent.class);
        Root<ScheduledEvent> scheduledEventRoot = query.from(ScheduledEvent.class);
        Predicate scheduleDatePredicate = criteriaBuilder
                .equal(scheduledEventRoot.get(ScheduledEvent_.DATE), criteriaBuilder.currentDate());
        Predicate scheduleTimePredicate = criteriaBuilder
                .between(criteriaBuilder.currentTime(), scheduledEventRoot.get(ScheduledEvent_.start),
                        scheduledEventRoot.get(ScheduledEvent_.end));
        query.select(scheduledEventRoot)
             .where(criteriaBuilder.and(scheduleDatePredicate, scheduleTimePredicate));
        //The equivalent JPQL:
        //SELECT e FROM ScheduledEvent e WHERE CURRENT_DATE = e.date AND
        // CURRENT_TIME BETWEEN e.start AND e.end

        List<ScheduledEvent> resultList = entityManager.createQuery(query).getResultList();
        resultList.forEach(System.out::println);
        entityManager.close();
    }

    private static void findTodayEvent() {
        System.out.println("-- today event  --");
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<ScheduledEvent> query = criteriaBuilder.createQuery(ScheduledEvent.class);
        Root<ScheduledEvent> scheduledEventRoot = query.from(ScheduledEvent.class);
        query.select(scheduledEventRoot)
             .where(criteriaBuilder.equal(
                     scheduledEventRoot.get(ScheduledEvent_.date),
                     criteriaBuilder.currentDate()
                     )
             );

        List<ScheduledEvent> resultList = entityManager.createQuery(query).getResultList();
        resultList.forEach(System.out::println);
        entityManager.close();
        //The equivalent JPQL:
        //SELECT e FROM ScheduledEvent e WHERE CURRENT_DATE = e.date
    }

    private static void findEventCreatedNow() {
        System.out.println("-- event created within 10 sec --");
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<ScheduledEvent> query = criteriaBuilder.createQuery(ScheduledEvent.class);
        Root<ScheduledEvent> scheduledEventRoot = query.from(ScheduledEvent.class);
        query.select(scheduledEventRoot)
             .where(criteriaBuilder.between(
                     scheduledEventRoot.get(ScheduledEvent_.eventCreated),
                     criteriaBuilder.literal(Timestamp.valueOf(LocalDateTime.now().minusSeconds(10))),
                     criteriaBuilder.currentTimestamp())
             );
        //The equivalent JPQL:
        //SELECT e FROM ScheduledEvent e WHERE e.eventCreated
        // BETWEEN :timestampStart AND CURRENT_TIMESTAMP
        // where timestampStart = Timestamp.valueOf(LocalDateTime.now().minusSeconds(10)))

        List<ScheduledEvent> resultList = entityManager.createQuery(query).getResultList();
        resultList.forEach(System.out::println);
        entityManager.close();
    }

    private static void persistEvent() {
        ScheduledEvent e1 = ScheduledEvent.create("Test event",
                LocalDate.of(2018, 6, 1),
                LocalTime.of(9, 30, 45),
                LocalTime.of(11, 45, 30),
                LocalDateTime.now().minusDays(10));

        ScheduledEvent e2 = ScheduledEvent.create("Test event2",
                LocalDate.now(),
                LocalTime.of(9, 30, 45),
                LocalTime.of(23, 45, 30),
                LocalDateTime.now().minusMonths(1));

        ScheduledEvent e3 = ScheduledEvent.create("Test event3",
                LocalDate.now(),
                LocalTime.of(18, 0, 0),
                LocalTime.of(20, 0, 0),
                LocalDateTime.now());

        EntityManager em = entityManagerFactory.createEntityManager();
        em.getTransaction().begin();
        em.persist(e1);
        em.persist(e2);
        em.persist(e3);
        em.getTransaction().commit();

        System.out.println("-- all persisted entities --");
        em.createQuery("SELECT e FROM ScheduledEvent e")
          .getResultList()
          .forEach(System.out::println);
        em.close();
    }
}
-- all persisted entities --
ScheduledEvent{id=1, eventName='Test event', date=2018-06-01, start=09:30:45, end=11:45:30, eventCreated=2019-02-25 23:28:37.711}
ScheduledEvent{id=2, eventName='Test event2', date=2019-03-07, start=09:30:45, end=23:45:30, eventCreated=2019-02-07 23:28:37.715}
ScheduledEvent{id=3, eventName='Test event3', date=2019-03-07, start=18:00:00, end=20:00:00, eventCreated=2019-03-07 23:28:37.715}
-- current ongoing event --
ScheduledEvent{id=2, eventName='Test event2', date=2019-03-07, start=09:30:45, end=23:45:30, eventCreated=2019-02-07 23:28:37.715}
-- today event --
ScheduledEvent{id=2, eventName='Test event2', date=2019-03-07, start=09:30:45, end=23:45:30, eventCreated=2019-02-07 23:28:37.715}
ScheduledEvent{id=3, eventName='Test event3', date=2019-03-07, start=18:00:00, end=20:00:00, eventCreated=2019-03-07 23:28:37.715}
-- event created within 10 sec --
ScheduledEvent{id=3, eventName='Test event3', date=2019-03-07, start=18:00:00, end=20:00:00, eventCreated=2019-03-07 23:28:37.715}

Example Project

Dependencies and Technologies Used:

  • h2 1.4.198: H2 Database Engine.
  • hibernate-core 5.4.1.Final: Hibernate's core ORM functionality.
    Implements javax.persistence:javax.persistence-api version 2.2
  • hibernate-jpamodelgen 5.4.1.Final: Annotation Processor to generate JPA 2 static metamodel classes.
  • JDK 1.8
  • Maven 3.5.4

Examples of Date Time methods in CriteriaBuilder Select All Download
  • jpa-criteria-api-date-time-operations
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • ExampleMain.java
          • resources
            • META-INF

    See Also