【问题标题】:Maximum possible date in JPAJPA 中的最大可能日期
【发布时间】:2012-10-08 05:48:57
【问题描述】:

有没有办法在 JPA 中表示最大(和最小)可能的日期而不是特定于数据库的? JPA 实现应该能够根据使用的方言将其转换为正确的值。

如果不是 JPA,Hibernate 特定的解决方案也可以。

编辑

在我们使用的应用程序中,有几个命名查询用于测试日期是否在给定范围内

SELECT ... FROM ... WHERE somedate BETWEEN startdate AND end date

如果范围是开放的(只有开始日期,或者只有结束日期),那么使用最大和最小日期来进行不同的查询会更容易,只需一次比较(这需要对现有应用程序进行一些更改,我会喜欢避免)。

编辑 2

对于不是一个真正的问题选民:问题是:

是否可以以与数据库无关的方式查询最大可能日期?

编辑 3

应用程序将日期存储为java.util.Date,如下所示

@Temporal( TemporalType.TIMESTAMP )
private java.util.Date someDate;

【问题讨论】:

  • 对接近投票的评论可能很有用。不相关?复制?如果它是重复的,那么提及一个链接也不错。
  • 我不是投票反对也不是投票关闭的人,但是您为什么需要此信息,您会在实际应用中使用它吗?
  • @LuiggiMendoza 我用解释编辑了这个问题
  • 如果是这样,为什么不将end 用作'3000-01-01'?我知道这不是最好的答案,但我怀疑同一个应用程序会使用 1000 年。
  • @LuiggiMendoza 这就是我现在正在做的,但如果有一个 cleaner 解决方案,我正在徘徊

标签: java database hibernate date jpa


【解决方案1】:

我相信(目前)还没有这样的功能可以以 DB 中立的方式获取最大/最小日期。

我建议您根据您要使用的 DBMS,在 Java 和 DB 存储函数中定义相应的常量。

因此,您可以执行以下操作:

Query query = session.createQuery("from Foo where date between :fromDate and :toDate");
query.setParameter("fromDate", DateConstants.MIN_DATE);
query.setParameter("toDate", DateConstants.MAX_DATE);

(我曾经称它为 FOREVER 和 EPOCH :P)

甚至有这样的 HQL(如果你在 DB 中创建了存储函数)

from Foo where date between MaxDate() and MinDate()

【讨论】:

  • 好的,然后我将有一个函数根据数据库返回最大值:根据当前数据库,我返回相应的日期(如果数据库未知/不支持,我返回类似 9999 的内容)
【解决方案2】:

一种选择是定义一个数据库函数,为您提供该信息。为您计划使用的每个数据库供应商定义它。然后使用该函数获取“当前使用的”数据库的最大日期。

【讨论】:

  • 也是一个好主意,我不知道它是否会更容易作为每个产品的常量。
  • 我觉得要看你怎么定义easy了。
  • 完全正确 :-) 无论如何,我注意到使用Dates 和 JPA 并不是一个真正的理想世界(太多特定于 DB 的东西,因为在 MySQL 上处理小于一秒的东西, 最大值和最小值的差异, ...)
【解决方案3】:

看看Best way to get maximum Date value in java?。只要您使用 Date 作为 java 类型,使用 JPA 或 Hibernate 应该没有区别。示例:

import java.util.Date;

@Entity
public class Foo {

   @Id
   @GeneratedValue
   long id;

   Date Bar;

   public void  setBar(Date bar) {
      this.bar = bar;
   }

   public Date getBar() {
      return bar;
   }
}

...

// An Entity
Foo foo;

// set minimum date
foo.setBar(new Date(0));

// set maximum date
foo.setBar(new Date(Long.MAX_VALUE));

【讨论】:

  • 真的吗?如果您尝试保存它会得到什么?
  • 仅仅是因为如果它被映射到一个定义为以微秒为单位的 8 个字节的时间戳,它将大 1000(日期(长值)以毫秒为单位)。但即使我们除以 1000,它也可以在 PostreSQL 上工作,但 Oracle 上的时间戳不能大于日期(最大值为 9999)
  • 这不是我问题的答案。您的问题是“JPA 中的最大可能日期”,所以如果我的回答不正确(new Date(Long.MAX_VALUE) 不是最大日期),那么我想知道您如何创建更大的日期?
  • 你不要创建它,因为数据库不支持它。当然,我可以在 Java 中创建一个更大的日期,但是如果我不能持久保存它怎么办?我在问题中明确说明了 JPA。如果您想使用 JPA 并保留您的 Date 对象,那么您有约束(遗憾的是基于 DB 实现)。
猜你喜欢
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多