可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

数据类型查找

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

在很多情况下,通常没有必要为 内置数据类型用户定义的数据类型 提供显式类型定义,无论是 列表达式,还是特别是 绑定值。 例如,假设使用 强制类型 将用户定义的数据类型附加到生成的代码,或者使用显式 转换的数据类型 将其附加到 纯 SQL 模板,则以下表达式可以从上下文中推断出用户定义的数据类型

// Comparison predicates with TableField/bind value pairs:
TABLE.COLUMN.eq(new MyType(1));

// Comparison predicates with TableField/bind value pairs in row value expressions in various forms:
row(TABLE.COLUMN1, TABLE.COLUMN2).eq(new MyType(1), new MyOtherType(2));
row(TABLE.COLUMN1, TABLE.COLUMN2).eq(row(new MyType(1), new MyOtherType(2)));

更复杂的表达式可能也能够做到这一点,具体取决于您的 jOOQ 版本。

但在某些情况下,DataType 无法从查询上下文中查找。 例如,这包括 纯 SQL 模板

// Plain SQL with bind values:
DSL.condition("column = ?", new MyType(1));

// Plain SQL with expressions:
DSL.condition("column = {0}", DSL.val(new MyType(1)));

// With Class<?> literals:
DSL.field("column", MyType.class);

jOOQ 历史上仍然可以为此类用户定义的数据类型查找第一个静态注册的 ConverterBinding,这就是为什么历史上,这些表达式可能仍然有效。 从 jOOQ 3.19 开始,不鼓励这种用法,并且会记录警告。

org.jooq.impl.DefaultDataType$DiscouragedStaticTypeRegistryUsage: null
    at org.jooq.impl.DefaultDataType.check(DefaultDataType.java)
    at org.jooq.impl.Val.accept(Val.java)
    at org.jooq.impl.AbstractBindContext.bindInternal(AbstractBindContext.java)
    at org.jooq.impl.AbstractBindContext.visit0(AbstractBindContext.java)
    at org.jooq.impl.AbstractContext.visit(AbstractContext.java)
    at ...

遇到此警告时,建议用户避免依赖此查找,原因如下

  • 用户定义的数据类型的使用与静态类型注册表中 Converter / Binding 的注册之间可能存在竞争条件
  • 对于同一用户定义的类型 Class<U>,可能存在多个 ConverterBinding(以及它们注册之间的竞争条件!)
  • 未来的 jOOQ 版本可能会不支持用户定义类型的静态类型注册表,而支持动态类型注册表。

如果您遇到此警告并且认为它不应该出现在您的查询中(jOOQ 应该能够从上下文中推断出 DataType),或者如果您难以解决此问题,请在此处报告问题:https://jooq.org/bug

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo