【问题标题】:Named query returns java.sql.Timestamp instead of java.util.Date命名查询返回 java.sql.Timestamp 而不是 java.util.Date
【发布时间】:2020-05-08 19:53:22
【问题描述】:

我使用的是 Hibernate 5.3.13

我正在使用命名查询查询日期:

    public Date getDate() {
        return entityManager.createNamedQuery("MyEntity.myNamedQuery", Date.class)
                            //setting some parameters here
                            .getSingleResult();
    }

列定义:

    @Column(name="date")
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

这个查询工作正常,但是当我想要 java.util.Date 时,hibernate 返回 java.sql.Timestamp。

是否可以让休眠返回日期而不是时间戳?

【问题讨论】:

  • java.sql.Timestampjava.util.Date 的子类型。这具体有什么问题?
  • 另外,为什么不使用新的java.time 类型,例如LocalDateTimeZonedDateTime,它们自然具有纳秒精度和更好的API,以及日期的就绪类型没有时间 - LocalDate
  • @M.Prokhorov 遗留项目,将所有内容迁移到新时间 API 需要大量工作。问题是,例如 timestamp.before(date) 与 date.before(date) 的工作方式不同
  • 最终,两个before 调用都会比较getTime(),唯一的区别是比较纳秒。如果时间戳没有纳秒,它们的工作方式相同。这是解决它的一种方法。还有另一个——做开发人员在使用j.u.Date 时总是做的事情,并且永远不要直接调用它的方法,用实用方法的思考墙包围它。或者只是咬住它并重构以至少在这个有限的容量中使用新类型。有些工厂允许与旧类型进行一些接口,让您轻松进入它。
  • 最后我将两个变量都转换为 Instant 并比较 Instants。

标签: java hibernate jpa


【解决方案1】:

取自Hibernate – Mapping Date and Time

正如我们所见,java.util.Date 类型(毫秒精度)不足以处理 Timestamp 值(纳秒精度)。

因此,当我们从数据库中检索实体时,我们会毫不意外地在该字段中找到一个 java.sql.Timestamp 实例,即使我们最初保存了一个 java.util.Date:

[...]

这对我们的代码应该没问题,因为时间戳扩展了日期。

您可以将返回的值转换为Date

总体上查看参考资料,它为您提供了更多详细信息。

【讨论】:

  • 我可以做 new Date(timestamp.getTime()) 但我希望hibernate有可能处理它。
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多