将CriteriaBuilder.between(Date)添加到谓词?

时间:2017-01-23 12:15:50

标签: java hibernate jpa

我是JPA的新手

我正在尝试查询一个表,其输入日期值应该在数据库记录的startDate和endDate之间

我正在尝试:

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

我从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")); 

但是如何在将CriteriaBuilder添加到Predicate之前将Parameterexpression值设置为inputDate变量值?

3 个答案:

答案 0 :(得分:5)

这样的事情应该有用......

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[]{}));

答案 1 :(得分:5)

你可以这样试试。


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

这种方式适用于我的情况。

但是对于你的情况(使用ParameterExpression)。


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

创建查询时,您需要设置参数。 currentDate是你的约会对象, d之前您创建的是 ParameterExpression

我更喜欢第一种方式,对我来说更直观和合乎逻辑。

答案 2 :(得分:3)

尝试一下:

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