【问题标题】:Fetching a itimestamp with time zone value in hibernate在休眠中获取具有时区值的时间戳
【发布时间】:2019-01-10 09:31:25
【问题描述】:

我正在使用 Hibernate、Spring Boot 和 Postgres。我有一个time with time zone column 和另一个date 专栏。我尝试添加这两列以获得timestamp with timezone value。但是使用休眠查询只返回timestamp without time zone。有没有办法达到同样的效果

我的查询是这样的

@Query(value = "select date_col + time_with_timestamp_column from myTable" , nativeQuery = true) Timestamp fetchvalue();

【问题讨论】:

  • 使用 psql 中的本机查询对此进行了测试,它正确返回了 timestamp with time zone(或 timestamptz 短内部名称)。但是,如果该查询被解释为 JPQL,那么可能会添加一些对 timestamp 的类型转换。尝试在 PG 服务器上启用登录以检查 stackoverflow.com/questions/722221/…。之后不要忘记禁用它,因为这些日志会变得非常庞大。

标签: postgresql hibernate spring-boot


【解决方案1】:

如果您使用 Spring Data,您可以通过 @Query(..., native=true) 进行原生查询。这应该会导致查询作为实际 SQL 而不是 JPQL 执行,这可能会解决类型问题

【讨论】:

  • 即使添加相同的内容,问题仍然存在
  • 你有理由必须使用Timestamp吗? java.time 中有更好的日期类型,例如 OffsetDateTime,您在应用程序中使用可能会更好。但是,这可能无法解决这个特定问题。此外,如果您总是需要重新加入日期和时间,则不能将它们存储为单独的列。而是使用单个timestamp with time zone col 最后,您可以创建一个同时具有LocalDateOffsetTime 的DTO,并使用JPA Projection 将两个不同的值选择到其中,然后使用java 从中生成OffsetDataTime他们
  • 如果我们总是需要重新加入日期和时间,您能分享一下为什么我们不应该将日期和时间用作单独的列吗
  • 因为正是您面临的问题 - 将数据的一个元素(日期列、时间列)存储在两个单独的列而不是一列(日期时间)中有什么好处?如果您想在代码中将它们用作组合的日期时间,它只会增加额外的复杂性。
  • 没有这 2 列也必须单独使用。我认为在更改时区的情况下它会失败
【解决方案2】:

这有用吗?

select to_char(current_date,'DD/MM/YYYY') as newdate, to_char(current_date,'DD/MM/YYYY')||' 13:03:00' as text_datetime, to_timestamp( to_char(current_date,'DD/MM/YYYY')||' 13:03:00', 'DD/MM/YYYY HH24:MI:SS')::timestamp with time zone

【讨论】:

  • Hibernate 抛出 postgresql.util.PSQLException: ERROR: syntax error at or near ":" 异常
  • 好的,你可能需要研究转义序列,就像在 Python 中你可能会在问题字符前加上一个反斜杠。无论如何直接在 Postgresql 中尝试 sql,我只是展示了一种将日期和时间作为 varchar 加入并将其转换为 datetime 的方法
猜你喜欢
  • 2010-11-20
  • 2010-11-02
  • 2011-08-24
  • 2018-09-28
  • 1970-01-01
  • 2014-11-16
  • 2021-12-26
  • 2017-12-27
  • 1970-01-01
相关资源
最近更新 更多