数据类型查找
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
在很多情况下,通常没有必要为 内置数据类型 或 用户定义的数据类型 提供显式类型定义,无论是 列表达式,还是特别是 绑定值。 例如,假设使用 强制类型 将用户定义的数据类型附加到生成的代码,或者使用显式 转换的数据类型 将其附加到 纯 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 历史上仍然可以为此类用户定义的数据类型查找第一个静态注册的 Converter
或 Binding
,这就是为什么历史上,这些表达式可能仍然有效。 从 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>
,可能存在多个Converter
或Binding
(以及它们注册之间的竞争条件!) - 未来的 jOOQ 版本可能会不支持用户定义类型的静态类型注册表,而支持动态类型注册表。
如果您遇到此警告并且认为它不应该出现在您的查询中(jOOQ 应该能够从上下文中推断出 DataType
),或者如果您难以解决此问题,请在此处报告问题:https://jooq.org/bug。
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!