【发布时间】:2018-07-23 07:49:36
【问题描述】:
我在 Oracle 中存储了一些日期,Oracle 的 TIMESTAMP(3) 作为其数据类型。现在我正在编写一个 Spring Boot 应用程序来读取这些值。代码如下:
HibernateCallback callback = new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Query query = session.createSQLQuery("SELECT date_field FROM some_table WHERE some_conditions");
return query.list();
}
};
所以:
List results = (List)getHibernateTemplate().execute(callback);
// suppose there's only one row and one column returned
Timestamp ts = result.get(0)[0];
返回由 Hibernate 自动创建的 Java Timestamp 对象。问题是,在构造对象时,它忽略了存储在 Oracle 中的时区,而是使用 JVM 的默认时区。我测试的是通过为JVM设置不同的时区,每次生成不同的时间戳。
这显然是错误的。日期在时间线上应该是唯一的。它不应该依赖于 JVM 的时区。我想知道在解析日期时包含数据库时区信息的正确方法是什么。现在看来它只是使用存储在 Oracle 中的字符串表示形式并使用 JMV 的时区对其进行解析。我正在使用休眠4.3.4.Final。
PS:实际查询是高度定制的,所以我必须编写原始 SQL。
【问题讨论】:
-
时间戳始终采用 UTC。如果你想要一个不同的时区,你必须使用
ZonedDateTime自己转换它。 -
是您的Oracle column data type
TIMESTAMP、TIMESTAMP WITH TIME ZONE还是TIMESTAMP WITH LOCAL TIME ZONE?每个都非常不同。 -
@BasilBourque 这是 TIMESTAMP(3);
-
@JFreebird 澄清应该作为对问题的编辑而不是作为评论发布。
标签: java oracle hibernate date