gpt4 book ai didi

jooq - 在 JOOQ 中,我们如何使用 Java Instant 映射到 Postgresql 时间戳类型?

转载 作者:行者123 更新时间:2023-12-05 03:26:56 28 4
gpt4 key购买 nike

我很惊讶地发现 JOOQ(从 3.16 开始)将时间戳绑定(bind)到 LocalDateTime。在我看来,时间戳最自然地映射到一个 Instant,它是一个 Unix 纪元时间戳。

那么我们怎样才能让 JOOQ 生成使用 Instant 而不是 LocalDateTime 的代码呢?我需要使用力发生器吗?

我试过像这样使用强制类型,但它从来没有选择我的强制类型。

                            .withForcedTypes(
new ForcedType()
.withUserType(Instant.class.getCanonicalName())
.withConverter(com.monsolei.data.InstantConverter.class.toString())
.withIncludeExpression("timestamp")
)

最佳答案

关于 PostgreSQL 时间戳数据类型

在 PostgreSQL 中(我假设您使用的是 PG),TIMESTAMPTIMESTAMP WITHOUT TIME ZONE 的缩写,如下所示:https://www.postgresql.org/docs/current/datatype-datetime.html

将其映射到的最佳 Java 类型是:

  • java.sql.Timestamp(旧的 JDBC 类型,其 valueOf()toString() 行为不支持时区和也适用于您本地的时区)
  • java.time.LocalDateTime

您也可以在 JDBC spec 中看到这一点,或者从有像 java.sql.Timestamp.valueOf(LocalDateTime) 这样的方法的事实中得出它和 java.sql.Timestamp.toLocalDateTime() .

您更喜欢使用 java.time.Instant 的事实暗示在 PostgreSQL 中使用 TIMESTAMP WITH TIME ZONE 更好,JDBC(以及 jOOQ)默认映射到 OffsetDateTime。您可以在 jOOQ 中重写该类型而无需转换器为 INSTANT: https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-forced-types/

您还可以在 PostgreSQL wiki 中看到此建议: https://wiki.postgresql.org/wiki/Don't_Do_This#Don.27t_use_timestamp_.28without_time_zone.29

您的具体配置

关于您映射类型的具体尝试:

.withIncludeExpression("timestamp")

这仅适用于名为 timestamp 的列。您可能打算将强制类型应用于类型名称?

.withIncludeTypes("timestamp")

关于jooq - 在 JOOQ 中,我们如何使用 Java Instant 映射到 Postgresql 时间戳类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71576487/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com