firstpostcommenter
firstpostcommenter

Reputation: 2911

Add CriteriaBuilder.between(Date) to Predicate?

I am new to JPA

I am trying to query a table where my input date value should be between the startDate and endDate of the database record

I am trying to do:

List<Predicate> conditionsList = new ArrayList<Predicate>();
conditionsList.add(criteriaBuilder.between(inputDate, root.get("startDate"), root.get("endDate")));

I found the below solution from Using JPA/Hibernate Criteria to pull between a date:

ParameterExpression<Date> d = criteriaBuilder.parameter(Date.class);
criteriaBuilder.between(d, root.<Date>get("startDate"), root.<Date>get("endDate")); 

But how to set the Parameterexpression value to inputDate variable value before adding the CriteriaBuilder to the Predicate?

Upvotes: 18

Views: 80893

Answers (3)

Nelson Azevedo
Nelson Azevedo

Reputation: 341

Try this:

criteriaBuilder.between(criteriaBuilder.literal(inputDate),
                        root.<Date>get("startDate"), 
                        root.<Date>get("endDate"));

Upvotes: 17

Gabriel Moreira
Gabriel Moreira

Reputation: 315

You can try this way.


    Predicate date =  cb.between(root.get("date"), dateBefore, dateAfter);
    predicate.add(date);

this way works for my case.

But for your case (using ParameterExpression).


    return entityManager.createQuery(query)
    .setParameter(d, currentDate, TemporalType.DATE).getResultList(); 

When you create the query you set parameters. currentDate is your date, d is ParameterExpression that you create before.

I prefer the first way, it is more intuitive and logical for me.

Upvotes: 18

jonhid
jonhid

Reputation: 2125

Something like this should work...

List<Predicate> conditionsList = new ArrayList<Predicate>();
Predicate onStart = criteriaBuilder.greaterThanOrEqualTo(root.get("startDate"), inputDate);
Predicate onEnd = criteriaBuilder.lessThanOrEqualTo(root.get("endDate"), inputDate);
conditionsList.add(onStart);
conditionsList.add(onEnd);
criteriaQuery.select(root).where(conditionsList.toArray(new Predicate[]{}));

Upvotes: 14

Related Questions