Add CriteriaBuilder.between(Date) to Predicate?

2020-03-26 04:48发布

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?

2条回答
▲ chillily
2楼-- · 2020-03-26 05:13

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.

查看更多
贪生不怕死
3楼-- · 2020-03-26 05:21

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[]{}));
查看更多
登录 后发表回答