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 类型
同时,您可以自己绑定所需的类型,并让代码生成器使用您的自定义Converter
或Binding
. 请参阅手册中的相关章节:
正确的映射
JDBC 4.2 规范定义了哪些 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 中时使用的时区。