jOOQ路线图
直到jOOQ 3.6,JSR-310日期时间类型都没有官方支持,因为jOOQ开源版和商业版仍然支持Java 6。
在jOOQ 3.7中,此更改发生了变化,因为仅在专门构建的商业发行版中支持Java
6,而标准发行版将需要Java8。此更改的相关问题是#4338。
另一个更改涉及一个标志
<javaTimeTypes/>,该标志告诉源代码生成器生成JSR-310类型,而不是
java.sql.Date和类似类型。默认情况下,此标志设置为false,因此在解决问题#5714之前,需要将其设置为true
。
在jOOQ 3.6以下使用JSR-310类型
同时,您可以自己绑定所需的类型,并让代码生成器使用您的自定义
Converter或
Binding。请参阅手册中的相关部分:
- http://www.jooq.org/doc/latest/manual/sql-building/queryparts/custom-bindings
- http://www.jooq.org/doc/latest/manual/pre-generation/custom-data-types
- http://www.jooq.org/doc/latest/manual/pre-generation/custom-data-type-bindings
正确的映射
的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 TIMEZONE数据类型(例如Oracle),另请参见此DBA /
StackExchange答案:https
://dba.stackexchange.com/a/59021/
2512。由于不存储时区,因此映射
java.time.Instant到您的方法
TIMESTAMPWITH TIME ZONE更好,因为SQL类型实际上只是UTC时间戳。
话虽如此,
OffsetDateTime仍然可以映射到
TIMESTAMP WITH TIMEZONE,但是当时间戳存储在PostgreSQL中时,您将不知道使用了哪个时区。



