当前位置: 首页 > 面试题库 >

比较JPA Criteria API中的日期实体

马晓博
2023-03-14
问题内容

将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中的动态,类型安全查询



 类似资料:
  • 所以今年早些时候,我在大学里接到了一个任务。任务是使用OOP程序创建一个停车场管理系统。例如,我们学习了如何使用继承、抽象类和实例。我已经完成了并通过了这个作业,所以这个问题只是为了知识目的。其中一个任务是按时间顺序对对象的 Array 列表进行排序。为此,我们学习了可比/比较器方法。但是,我无法理解它,也无法做到这一点。问题是,我们必须对数组列表中的“Vehicle”对象中的“DateTime”

  • 问题内容: 我想比较数据库中2个给定日期之间的日期。数据库中的列是DATETIME,我只想将其与日期格式进行比较,而不要与datetime格式进行比较。 执行上面的SQL时出现此错误: 您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以在’us_reg_date,120)> =‘2000-07-05’AND CONVERT(CHAR(10),us_reg_date,120)<=‘2

  • 目前,我正努力争取与之相比的约会。更重要的是,我有一个属性Death的人,格式是YYYY-MM-DD,如果这个人已经死了(Death 我尝试了以下做法: 但我只收到来自浏览器的解析错误。我使用的是XSL1.0版,除了xmlns:XSL=“http://www.w3.org/1999/XSL/transform”之外,没有任何名称空间。

  • 我有一个rails生成的日期和一个jQuery生成的日期。 导轨日期打印如下: jQuery日期打印如下: 我想检查jQuery日期是大于还是小于rails日期。但是不管日期如何,jQuery日期总是被解释为比rails日期大。 为什么会这样,我怎样才能成功地比较这两个日期? 更新: 事实上,我刚刚发现问题在于它只允许1969年之前的日期。我打算代码只允许18岁以上的日期。有人知道为什么不同吗?

  • 问题内容: 我需要在Java中比较两个日期。我正在使用这样的代码: 这是行不通的。变量的内容如下: 包含 包含 我该如何解决? 问题答案: 日期相等性取决于两个等于毫秒的日期。使用创建新的Date对象将永远不会等于过去创建的日期。Joda Time 的API简化了日期的处理。但是,仅使用Java的SDK:

  • 代码: 输出:(增加空白行以提高可读性) 有两件事我不明白: null 我还查看了date.equals()的实现: 那么,为什么返回false,尽管为两个对象都返回了1406498400000? 参考:http://docs.oracle.com/javase/7/docs/api/java/util/date.html#equals(java.lang.object)