使用EclipseLink实现的JPA 2。
我正在尝试构建一个动态查询,该查询应获取一些在给定日期之后持久化的记录。
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>>
我能想象我可能没有采取正确的方法来解决这个问题,但我找不到任何关于可能解决方案的提示或指针。
builder.greaterThanOrEqualsTo(root.get(Some_.date), date)
<>builder.greaterThanOrEqualsTo(root.<Date>get(Some_.date), date)
- Jin Kwonjavax.persistence.criteria.Predicate
,而不是java.util.function.Predicate
。这对我有用 :) - HankPath path = root.get( .....); builder.greaterThan(path, date);
- FiruzzZ