2017-01-23 118 views
0

我是新来的JPAAdd CriteriaBuilder.between(Date)to Predicate?

我想查询一个表,其中我输入的日期值应为数据库记录的起始日期和结束日期之间

我试图做的事:

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

但是如何设置Parameterexpression值inputDat将CriteriaBuilder添加到Predicate之前的变量值?

+0

你可以显示你的根类吗? – jonhid

回答

1

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

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

谢谢,我想知道builder.between(date)是否可以通过ParameterExpression或其他可能的方式 – firstpostcommenter

1

你可以试试这个方法。

 

    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​​你以前创建。

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