jOOQ - 支持 JSR310
jOOQ - support for JSR310
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.Timestamp
、java.sql.Date
和 java.sql.Time
以及上面的四个 类 之间的翻译(双向)?
jOOQ 路线图
直到jOOQ 3.6,官方才支持JSR-310日期时间类型,因为jOOQ开源版和商业版都支持Java 6.
在 jOOQ 3.7 中,这发生了变化,因为 Java6 仅在专门构建的商业发行版中受支持,而标准发行版将需要 Java8。此更改的相关问题是 #4338.
另一项更改涉及标志 <javaTimeTypes/>
以告知源代码生成器生成 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 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时使用的是什么时区。
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 是否结合 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.Timestamp
、java.sql.Date
和 java.sql.Time
以及上面的四个 类 之间的翻译(双向)?
jOOQ 路线图
直到jOOQ 3.6,官方才支持JSR-310日期时间类型,因为jOOQ开源版和商业版都支持Java 6.
在 jOOQ 3.7 中,这发生了变化,因为 Java6 仅在专门构建的商业发行版中受支持,而标准发行版将需要 Java8。此更改的相关问题是 #4338.
另一项更改涉及标志 <javaTimeTypes/>
以告知源代码生成器生成 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 spec 定义了哪些 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 以查看默认情况下何时启用此功能。