【问题标题】:Update records with timestamp where clause with Hibernate HQL使用 Hibernate HQL 使用时间戳 where 子句更新记录
【发布时间】:2019-09-26 07:00:50
【问题描述】:

我用 Hibernate HQL 编写了一个查询,它用时间戳列更新了一些记录:

where 子句:

creationTime >= :creationTimeFrom and creationTime <= :creationTimeTo

设置参数:

query.setDate("creationTimeFrom", creationTimeFrom);
query.setDate("creationTimeTo", creationTimeTo);

在某些情况下,查询结果与记录不匹配,有些记录没有更新,

我猜问题出在时区上。oracle 服务器时区设置为 UTC。但是客户端的时区不同。

【问题讨论】:

  • 在 ANSI SQL 中,ts BETWEEN a AND b 与 ts &gt;= a AND ts &lt;= b 相同,我认为在 HQL 中也是如此,无论如何它只是被翻译成一些 SQL 方言。所以,我不认为这是你的问题。
  • 是的,ts BETWEEN a AND b 等同于 ts >= a AND ts
  • 帖子已更新。
  • 也许问题是您的creationTime 有一个与日期相关联的时间。然后尝试将creationTime 转换为没有时间的格式。类似creationTime(to_date(column,'DD-MM-YYYY'))

标签: oracle hibernate timestamp hql timestamp-with-timezone


【解决方案1】:

您可能想尝试明确设置 TimeZone,否则使用默认的 JVM 日历。

TimeZone.setDefault( TimeZone.getTimeZone( "UTC" ) );

从 Hibernate 5.2.3 开始:

settings.put(
    AvailableSettings.JDBC_TIME_ZONE,
    TimeZone.getTimeZone( "UTC" )
);

参考:jdbc-time-zone-configuration-property:

【讨论】:

    【解决方案2】:

    我在我的 HQL 代码中使用了已弃用的类。 我解决了这个问题,问题就解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-19
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 2018-11-03
      • 2015-12-31
      相关资源
      最近更新 更多