jOOQ - 支持 JSR310

Posted

技术标签:

【中文标题】jOOQ - 支持 JSR310【英文标题】:jOOQ - support for JSR310 【发布时间】:2015-10-23 06:14:36 【问题描述】:

jOOQ 是否结合 PostgreSQL 提供对 JSR310 的支持?特别是,我正在尝试使用以下类:

java.time.Instant java.time.LocalDate java.time.LocalTime java.time.LocalDateTime

我存储在以下数据类型中(根据http://www.postgresql.org/docs/9.1/static/datatype-datetime.html):

java.time.Instant: timestamp with timezone java.time.LocalDate: date java.time.LocalTime: time without timezone java.time.LocalDateTime: timestamp without timezone

这些数据类型是否正确?

jOOQ 是否支持java.sql.Timestampjava.sql.Datejava.sql.Time 以及上述四个类(双向)之间的转换?

【问题讨论】:

我在这里找不到东西:github.com/jOOQ/jOOQ/… 和 github.com/jOOQ/jOOQ/issues?utf8=%E2%9C%93&q=310 你用的是什么数据库? 我正在使用 PostgreSQL。 (我即将编辑我的问题,建议的数据类型不完整。) 好的,我等着回答,然后…… @LukasEder 我完成了我的编辑!提前致谢。 【参考方案1】:

jOOQ 路线图

直到 jOOQ 3.6,官方还没有对 JSR-310 日期时间类型的支持,因为 jOOQ 开源版和商业版仍然支持 Java 6。

在 jOOQ 3.7 中,此更改为 Java 6 仅在专门构建的商业发行版中受支持,而标准发行版将需要 Java 8。此更改的相关问题是 #4338。

另一个变化涉及一个标志<javaTimeTypes/> 告诉源代码生成器生成JSR-310 类型而不是java.sql.Date 和类似类型。默认情况下,此标志设置为 false,因此您需要将其设置为 true,直到问题 #5714 得到解决。

在 jOOQ 3.6 或更低版本中使用 JSR-310 类型

同时,您可以自己绑定所需的类型,让代码生成器使用您自定义的ConverterBinding。请参阅手册中的相关部分:

http://www.jooq.org/doc/latest/manual/sql-building/queryparts/custom-bindings http://www.jooq.org/doc/latest/manual/code-generation/custom-data-types http://www.jooq.org/doc/latest/manual/code-generation/custom-data-type-bindings

正确的映射

JDBC 4.2 spec 定义了哪些 JSR-310 数据类型应该映射到哪些 JDBC 数据类型(这与 PostgreSQL 的理解一致)。特别是,JDBC 规范列出了:

添加了将 java.time.LocalDate 映射到 JDBC DATE 的支持。 增加了将java.time.LocalTime映射到JDBC TIME的支持 添加了将 java.time.LocalDateTime 映射到 JDBC TIMESTAMP 的支持。 添加了将 java.time.OffsetTime 映射到 JDBC TIME_WITH_TIMEZONE 的支持。 添加了将 java.time.OffsetDateTime 映射到 JDBC TIMESTAMP_WITH_TIMEZONE 的支持。

不过,JDBC 的理解似乎并不完全正确,因为很少有数据库真正将时区信息存储在 TIMESTAMP WITH TIME ZONE 数据类型中(例如 Oracle 会这样做),另请参阅此 DBA/StackExchange 答案:https://dba.stackexchange.com/a/59021/2512。由于不存储时区,您将java.time.Instant 映射到TIMESTAMP WITH TIME ZONE 的方法更好,因为SQL 类型实际上只是一个UTC 时间戳

话虽如此,OffsetDateTime 仍然可以映射到TIMESTAMP WITH TIME ZONE,但是您将不知道时间戳存储在 PostgreSQL 中时使用的时区。

【讨论】:

感谢您的详细信息。链接也很有用!我将尝试实现我自己的转换器。如果您在开发方面需要帮助,请随时给我留言。我下个月底有空。 @SophiaAceves:感谢您的提议。我们已经完成了一半。 :) 但也许还有其他你可能想做的事情。我怎样才能联系到您?【参考方案2】:

jOOQ 3.9.0 现在可以在代码中配置 JSR-310 支持:

new Configuration()
     .withGenerator(new Generator()
          .withGenerate(new Generate()
              .withJavaTimeTypes(true)));

相同的结构将适用于 xml 配置(配置 - 生成器 - 生成 - javaTimeTypes)

密切关注https://github.com/jOOQ/jOOQ/issues/5714,看看默认情况下何时启用。

【讨论】:

以上是关于jOOQ - 支持 JSR310的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jOOQ 通过 SQLite 正确生成日期和时间类型

杰克逊 jsr310 中缺少 ZonedDateTimeDeserializer

如何使用 jsr310 DateTimeFormatter 解析不区分大小写的字符串?

如何使用 Spring Data JPA 持久化 JSR-310 类型?

在 Java 8 / jsr310 中格式化持续时间

使用 Jackson JSR310 模块反序列化 LocalDateTime