Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 529
firstpostcommenter Avatar asked Jan 23 '17 12:01

firstpostcommenter


3 Answers

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[]{}));
like image 75
jonhid Avatar answered Nov 02 '22 17:11

jonhid


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.

like image 15
Gabriel Moreira Avatar answered Nov 02 '22 17:11

Gabriel Moreira


Try this:

criteriaBuilder.between(criteriaBuilder.literal(inputDate),
                        root.<Date>get("startDate"), 
                        root.<Date>get("endDate"));
like image 11
Nelson Azevedo Avatar answered Nov 02 '22 19:11

Nelson Azevedo