使用JPA 2與EclipseLink實現。比較日期實體在JPA標準API
我試圖建立一個動態查詢,應該給我一些記錄在給定的日期後保留。
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Event> criteria = builder.createQuery(Event.class);
Root<Event> root = criteria.from(Event.class);
criteria.select(root);
criteria.distinct(true);
List<Predicate> predicates = new ArrayList<Predicate>();
//...
if (dateLimit != null){
ParameterExpression<Date> param = builder.parameter(Date.class, "dateLimit");
predicates.add(builder.lessThanOrEqualTo(root.get("dateCreated"), param));
}
lessThanOrEqualTo()
和le()
API中僅有的兩個方法看起來像可以幫助我在這種情況下。這個警告是由Eclipse雖然拋出:
Bound mismatch: The generic method lessThanOrEqualTo(Expression<? extends Y>, Expression<? extends Y>)
of type CriteriaBuilder is not applicable for the arguments (Path<Object>, ParameterExpression<Date>).
The inferred type Object is not a valid substitute for the bounded parameter
<Y extends Comparable<? super Y>>
我可以想像,我不會考慮這個問題的正確方法,但我找不到任何地方的可能解決方案的一些提示或指針。
NetBeans 8.2仍會以條件警告。我不知道爲什麼。 ''builder.greaterThanOrEqualsTo(root.get(Some_.date),date)''''builder.greaterThanOrEqualsTo(root。 get(Some_.date),date)' –
2016-10-04 11:06:56
@Jin Kwon:確保導入'javax.persistence .criteria.Predicate',而不是'java.util.function.Predicate'。這爲我修復:) – Hank 2017-03-07 14:57:54
是不是一個不好的進口問題,這是一個錯誤,一個非常古老的問題。 解決方法您必須將其聲明爲變量並將其用作參數: 'Path path = root.get(.....); builder.greaterThan(路徑,日期);' – FiruzzZ 2017-11-14 12:03:36