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
:带时区的时间戳
java.time.LocalDate
:日期
java.time.LocalTime
:没有时区的时间
java.time.LocalDateTime
:没有时区的时间戳
这些数据类型是否正确?
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 .
另一个变化涉及标志 <javaTimeTypes/>
告诉源代码生成器生成 JSR-310 类型而不是 java.sql.Date
和类似的类型。默认情况下,此标志设置为 false,因此您需要将其设置为 true 直到问题 #5714已解决。
在 jOOQ 3.6 或更低版本中使用 JSR-310 类型
同时,您可以自己绑定(bind)所需的类型,让代码生成器使用您的自定义 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 spec定义哪些 JSR-310 数据类型应该映射到哪些 JDBC 数据类型(这与 PostgreSQL 的理解相同)。特别是,JDBC 规范列表:
- 添加了对 map 的支持
java.time.LocalDate
到 JDBCDATE
. - 添加了对 map 的支持
java.time.LocalTime
到 JDBCTIME
- 添加了对 map 的支持
java.time.LocalDateTime
到 JDBCTIMESTAMP
. - 添加了对 map 的支持
java.time.OffsetTime
到 JDBCTIME_WITH_TIMEZONE
. - 添加了对 map 的支持
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 中时,您将不知道使用的是哪个时区。
关于java - jOOQ - 支持 JSR310,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31748327/