比较JPA Criteria API中的日期实体
将JPA 2与EclipseLink实现一起使用。
我正在尝试建立一个动态查询,该查询应该使我在给定日期后仍保留一些记录。
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中仅有的两个方法可能对我有帮助。该警告是由日食引发的:
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>>
我可以想象我没有针对此问题采取正确的方法,但是我找不到任何可能的解决方案的提示或指示。
回答:
问题在于,使用基于字符串的API时,无法推断get
-Operation 的结果值的类型。例如,在Javadoc for
Path中对此进行了说明。
如果您使用
predicates.add(builder.lessThanOrEqualTo(root.<Date>get("dateCreated"), param));
相反,它可以正常工作,因为它可以从type参数中找出返回类型并发现它是可比较的。注意,使用参数化方法调用root.<Date>get(...)
另一种(在我看来更好)的解决方案是使用基于元模型的API而不是基于字符串的API。这里给出一个有关规范元模型的简单示例。如果您有更多的时间进行投资,那么这是一篇有关静态元模型的好文章:JPA2.0中的动态,类型安全查询
以上是 比较JPA Criteria API中的日期实体 的全部内容, 来源链接: utcz.com/qa/430892.html