用 JPA 比较两个日期

Posted

技术标签:

【中文标题】用 JPA 比较两个日期【英文标题】:Compare two dates with JPA 【发布时间】:2010-11-23 18:51:45 【问题描述】:

我需要比较 JPQL 查询中的两个日期,但它不起作用。

这是我的查询:

Query query = em.createQuery(
    "SELECT h 
     FROM PositionHistoric h, 
          SeoDate d 
     WHERE h.primaryKey.siteDb = :site 
     AND h.primaryKey.engineDb = :engine 
     AND h.primaryKey.keywordDb = :keyword 
     AND h.date = d 
     AND d.date <= :date 
     ORDER BY h.date DESC");`

我的参数日期是 java.util.Date

我的查询返回一个对象列表,但日期是我的参数的上限和下限。

有人知道怎么做吗?

谢谢。

【问题讨论】:

您能否发布您的PositionHistoricSeoDate 类的片段,其中相关属性被注​​释?否则很难理解发生了什么。您的命名方案似乎相当不一致。 【参考方案1】:

我建议使用 java.sql.Date 而不是 java.util.Date

因为您将它传递给 JPQL(一种 SQL)。

我通常使用 TIMESTAMP 代替 Date,但如果你没有选择..

它是:h.date = d.date 而不是 h.date = d 吗?

【讨论】:

【参考方案2】:

您应该使用的查询是:

 FROM PositionHistoric h
   INNER JOIN FETCH h.date
WHERE h.primaryKey.siteDb = :site
  AND h.primaryKey.engineDb = :engine
  AND h.primaryKey.keywordDb = :keyword
  AND h.date.date <= :date

请注意,按h.date 排序是毫无意义的(因为它指向 SeoDate 实体,因此实际上您是按 PK 排序)并且您不能按 h.date.date 排序,因为 SeoDate 映射为many-to-one

另请注意,INNER JOIN FETCH h.date 行本身不是必需的,但如果您确实需要在返回的列表中使用 SeoDate 属性,它将为您节省一些额外的惰性查询开销。

【讨论】:

您的解决方案的问题是我获得了一个 PositionHistoric 但我不确定这个对象是已知的最后日期 您获得了PositionHistoric 实体的列表;所有这些都将链接到SeoDate 实体,其日期早于您的参数。这就是您发布的原始查询试图做的事情,除了它有效。如果您需要做其他事情,您需要澄清您的问题并准确解释您想要实现的目标。 我发现了我的错误。在我的 primaryKey 中,没有包含日期​​,因此 JPA 每次都返回相同的对象。我已将日期包含在 primaryKey 中,一切正常。感谢您的回答。

以上是关于用 JPA 比较两个日期的主要内容,如果未能解决你的问题,请参考以下文章

比较 JPA Criteria API 中的日期实体

如何用java代码比较两个日期

关于SHELL脚本中日期大小的比较

oracle11g中如何比较两个日期

如何在javascript中比较两个字符串日期?

java 日期比较(compareTo)