比较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

回到顶部