2017-01-23 248 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​​你以前創建。

我更喜歡第一種方式,它對我來說更直觀合乎邏輯。