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

fir*_*ter 3 java hibernate jpa

我是JPA的新手

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

我想做:

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

我发现以下解决方案来自于使用JPA/Hibernate Criteria来介绍日期:

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

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

jon*_*hid 6

像这样的东西应该工作......

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[]{}));
Run Code Online (Sandbox Code Playgroud)


小智 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是你的约会, dParameterExpression你之前创造的.

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


Nel*_*edo 5

尝试这个:

criteriaBuilder.between(criteriaBuilder.literal(inputDate),
                        root.<Date>get("startDate"), 
                        root.<Date>get("endDate"));
Run Code Online (Sandbox Code Playgroud)