java - 比较 JPA Criteria API 中的日期实体

标签 java date jpa-2.0 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 中仅有的两种方法,在这种情况下看起来可能对我有帮助。不过这个警告是由 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>>

我可以想象我没有采取正确的方法来解决这个问题,但我在任何地方都找不到可能的解决方案的提示或指示。

最佳答案

问题是基于字符串的 API 无法推断 get 的结果值的类型。 -手术。例如,Javadoc for Path 中对此进行了解释。 .

如果你使用

predicates.add(builder.lessThanOrEqualTo(root.<Date>get("dateCreated"), param));

相反,它会正常工作,因为它可以从类型参数中找出返回类型,并且会发现它是可比较的。注意,使用参数化方法调用 root.<Date>get(...) (参见,例如,When is a parameterized method call useful?)。

另一个(我认为更好的)解决方案是使用基于元模型的 API 而不是基于字符串的 API。给出了一个关于规范元模型的简单示例,例如 here .如果你有更多的时间投入,这是一篇关于静态元模型的好文章:Dynamic, typesafe queries in JPA 2.0

关于java - 比较 JPA Criteria API 中的日期实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9449003/

相关文章:

excel - 识别模式并提取子串

jquery - 使用 jQuery 比较两个日期

java - 为什么外键数据不会持久化到mysql数据库?

java - 无法使用 XPATH 设置 header

java - CAS 过滤器在部署 war 时不拦截服务票据

java - 如何在 Java 中使用 DecimalFormat 格式化整数?

java - 在 Freemarker 中打印日期天数差异时出错

hibernate - JPA/hibernate : Can you create a join query on an specific MapKey?

hibernate - 如何使用 Hibernate 4 手动设置 @Version 字段?

java - 在相机预览中显示图像?