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