当前位置: 首页 > 面试题库 >

jOOQ-支持JSR310

卓云
2023-03-14
问题内容

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.Instanttimestamp with timezone
  • java.time.LocalDatedate
  • java.time.LocalTimetime without timezone
  • java.time.LocalDateTimetimestamp without timezone

这些数据类型正确吗?

jOOQ是否支持java.sql.Timestampjava.sql.Date和之间java.sql.Time以及上述四个类之间的转换(双向)?


问题答案:

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类型

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

  • 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规范列出了:

  • html" target="_blank">添加了对映射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是否结合PostgreSQL为JSR310提供支持?特别是,我尝试使用以下类:

  • 我对JOOQ产品与AWS RDS Aurora MySQL的兼容性有点困惑。 也许这纯粹是一项牌照限制,而非技术限制。 本页https://www.jooq.org/legal/licensing#databases在专业版中显示RDS Aurora支持 我的问题是: 有谁能确认这实际上是一个许可证使用条款限制,而不是开源代码的技术限制,例如,当使用专业版时,并不是一个实际会运行不同风格的JOOQ

  • 我知道jOOQ将在不支持它的系统(如PostgreSQL)上模拟SQLMERGE。 我有一个带有串行(自动增量)id列和字符串uri列的表。我想在我的数据库中使用数字ID而不是URI,所以我必须确保在ID查找表中有一个URI。因此,按照jOOQ手册中的示例,我认为这将起作用: 这给了我一个这样的语句: 但是日志说jOOQ继续并尝试用绑定值执行查询。但是该表从未更新。所以我猜jOOQ没有在Postg

  • 我正在评估我们是否可以为我们的项目从普通JDBC迁移到jOOQ。其中大部分看起来很有希望,但我现在想知道一个特定的流:嵌套行。让我解释一下。 假设您有以下两张表: (我们假设一个学生只能是一个班级的一员。) 让我们为这些表创建一个响应类型。我将在下面的查询中使用这些。 现在让我们使用嵌套行获取所有带有学生的类: 一种有用的变体是仅在数组中使用嵌套行: 我想知道jOOQ是否有一种优雅的方法来解析包含

  • 我不能使用jOOQ生成器为MySQL生成类,但在PostgreSQL中是逆的 我在代码生成配置文件中包含了“dual”: 我正在使用jOOQ的最新版本:2.4.0。可能有什么问题?

  • 我遇到了这个问题java.lang.IllegalArgumentException:MySQL只支持单个生成的值。在我所有的insert查询中,不仅仅是这个表。我使用的是jooq 3.15和r2dbc。可能是什么问题 堆栈跟踪 生成的sql对我来说似乎没有问题,我甚至尝试在workbench上成功地插入它 表ddl看起来是这样的,它相当简单