jOOQ - 支持 JSR310

2022-09-03 06:13:55

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.Timestampjava.sql.Datejava.sql.Time


答案 1

jOOQ 路线图

在 jOOQ 3.6 之前,官方还没有对 JSR-310 日期时间类型的支持,因为 jOOQ 开源版和商业版仍然支持 Java 6。

在 jOOQ 3.7 中,这种情况发生了变化,因为 Java 6 仅在专门构建的商业发行版中受支持,而标准发行版将需要 Java 8。与此更改相关的问题是 #4338

另一个更改涉及一个标志,用于告诉源代码生成器生成JSR-310类型而不是和类似类型。默认情况下,此标志设置为 false,因此您需要将其设置为 true,直到问题 #5714 得到解决。<javaTimeTypes/>java.sql.Date

将 JSR-310 类型与 jOOQ 3.6 或更低版本配合使用

同时,您可以自己绑定所需的类型,并让代码生成器使用您的自定义或 .请参阅手册中的相关部分:ConverterBinding

正确的映射

JDBC 4.2 规范定义了哪些 JSR-310 数据类型应该映射到哪些 JDBC 数据类型(这与 PostgreSQL 对相同的理解一致)。特别是,JDBC 规范列出了:

  • 添加了对映射到 JDBC 的支持。java.time.LocalDateDATE
  • 添加了对映射到 JDBC 的支持java.time.LocalTimeTIME
  • 添加了对映射到 JDBC 的支持。java.time.LocalDateTimeTIMESTAMP
  • 添加了对映射到 JDBC 的支持。java.time.OffsetTimeTIME_WITH_TIMEZONE
  • 添加了对映射到 JDBC 的支持。java.time.OffsetDateTimeTIMESTAMP_WITH_TIMEZONE

然而,JDBC的理解似乎并不完全正确,因为很少有数据库真正以数据类型存储时区信息(例如Oracle确实如此),另请参阅此DBA / StackExchange答案:https://dba.stackexchange.com/a/59021/2512。由于不存储时区,因此映射到的方法更好,因为SQL类型实际上只是一个UTC时间戳。TIMESTAMP WITH TIME ZONEjava.time.InstantTIMESTAMP WITH TIME ZONE

话虽如此,仍然可以映射到 ,但是当时间戳存储在PostgreSQL中时,您将不知道使用了哪个时区。OffsetDateTimeTIMESTAMP WITH TIME ZONE


答案 2

JSR-310 支持现已在 jOOQ 3.9.0 中提供,可在代码中进行配置:

new Configuration()
     .withGenerator(new Generator()
          .withGenerate(new Generate()
              .withJavaTimeTypes(true)));

相同的结构将应用于xml配置(配置 - 生成器 - 生成 - javaTimeTypes)

请留意 https://github.com/jOOQ/jOOQ/issues/5714,了解默认情况下何时启用此功能。


推荐