Postgresql 在hibernate中获取具有时区值的itimestamp

Postgresql 在hibernate中获取具有时区值的itimestamp,postgresql,hibernate,spring-boot,Postgresql,Hibernate,Spring Boot,我正在使用Hibernate,Postgres的Spring Boot。我有一个带时区的时间列和另一个日期列。我尝试添加这两列以获得带有时区值的时间戳。但是使用hibernate查询只返回时间戳,而不返回时区。有没有办法达到同样的效果 我的问题是 @Query(value=“从myTable中选择带有时间戳列的日期列+时间列”,nativeQuery=true) 时间戳fetchvalue()这有用吗 select to_char(current_date,'DD/MM/YYYY') as ne

我正在使用Hibernate,Postgres的Spring Boot。我有一个带时区的
时间列和另一个
日期列。我尝试添加这两列以获得带有时区值的
时间戳。但是使用hibernate查询只返回时间戳,而不返回时区。有没有办法达到同样的效果

我的问题是

@Query(value=“从myTable中选择带有时间戳列的日期列+时间列”,nativeQuery=true)
时间戳fetchvalue()

这有用吗

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

如果您使用的是Spring数据,则可以通过
@query(…,native=true)
使查询成为本机查询。这将导致查询作为实际的SQL而不是JPQL执行,JPQL可能会解决类型问题

在psql中使用本机查询对此进行测试,并且它正确返回带时区的时间戳(或
时间戳
短内部名称)。然而,如果该查询被解释为JPQL,那么可能会添加一些对时间戳的类型转换。尝试在PG服务器上启用日志记录以进行检查。不要忘了在之后禁用它,因为这些日志会变得非常庞大。Hibernate会在“
postgresql.util.PSQLException:错误:语法错误”处或附近抛出“
exceptionOK您可能需要研究转义序列,就像在Python中,您可能会在问题字符前面加反斜杠一样。无论如何,直接在Postgresql中尝试sql,我只是展示了一种将日期和时间连接为varchar并将其转换为DateTime的方法,即使在添加相同的日期和时间之后,问题仍然存在,这是您必须使用时间戳的原因吗?在
java.time
中有更好的日期类型,例如
OffsetDateTime
您可能会在应用程序中使用得更好。不过,这可能无法解决这一特殊问题。此外,如果总是需要重新加入日期和时间列,则不能将其存储为单独的列。相反,使用一个带有时区的
时间戳
col最后,您可以创建一个既有
LocalDate
又有
OffsetTime
的DTO,并使用JPA投影选择其中两个不同的值,然后使用java从它们中生成一个
OffsetDataTime
。如果我们总是需要重新连接日期和时间,那么您可以分享一下为什么我们不应该将日期和时间作为单独的列使用,因为您正面临着这样的问题-将一个数据元素(日期列、时间列)存储在两个单独的列中而不是一列中有什么好处(datetime)?如果您想在代码中将它们作为组合datetime使用,那么它只会增加额外的复杂性。不需要将这两列分开使用。我认为在更改时区的情况下,它会失败