jOOQ – 支持JSR310
jOOQ是否支持JSR310与PostgreSQL结合使用? 特别是,我试图使用以下类:
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.Timestamp
, java.sql.Date
和java.sql.Time
以及上面的四个类(两个方向)之间的转换?
jOOQ路线图
直到jOOQ 3.6,没有官方支持JSR-310日期时间类型,因为jOOQ开源版和商业版仍然支持Java 6。
使用jOOQ 3.7,这种情况会发生变化,因为Java 6仅在专门构建的商业发行版中受支持,而标准发行版则需要Java 8.此更改的相关问题是#4338 。
另一个更改涉及一个标志
来告诉源代码生成器生成JSR-310类型而不是java.sql.Date
和类似类型。 默认情况下,此标志设置为false,因此您需要将其设置为true,直到问题#5714得到解决。
使用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/code-generation/custom-data-types
- http://www.jooq.org/doc/latest/manual/code-generation/custom-data-type-bindings
正确的映射
JDBC 4.2规范定义了哪些JSR-310数据类型应该映射到哪些JDBC数据类型(这与PostgreSQL对它的理解相符)。 特别是,JDBC规范列出:
- 添加了将
java.time.LocalDate
映射到JDBCDATE
。 - 添加了将
java.time.LocalTime
映射到JDBCTIME
- 添加了将
java.time.LocalDateTime
映射到JDBCTIMESTAMP
。 - 添加了将
java.time.OffsetTime
映射到JDBCTIME_WITH_TIMEZONE
。 - 添加了将
java.time.OffsetDateTime
映射到JDBCTIMESTAMP_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中时使用了什么时区。
现在可以在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以查看默认情况下何时启用此function。