使用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