如何显式地从 jOOQ 中的值 T 创建 Field<T>?

2022-09-03 02:23:43

在 jOOQ 中,很容易在表达式中使用绑定变量,例如:

MY_TABLE.COL.eq(1);
MY_TABLE.COL.in(1, 2, 3);
MY_TABLE.COL.between(1).and(10);

上述所有方法都接受这两种类型,例如 Field.eq(T)Field.eq(Field<T>)。但是,如果我想将绑定变量放在表达式的左侧,该怎么办?这些显然不起作用:TField<T>

1.eq(MY_TABLE.COL);
1.in(MY_TABLE.COL1, MY_TABLE.COL2, MY_TABLE.COL3);
1.between(MY_TABLE.COL1).and(MY_TABLE.COL2);

我怎么能把这些或变成或,等等?1"xyz"Field<Integer>Field<String>

(这是jOOQ邮件列表等上一个非常受欢迎的问题,所以我在这里记录它)


答案 1

接受的方法只是方便的方法。在幕后,他们都把争论包装在DSL.val(T)中。TT

// This
MY_TABLE.COL.eq(1);

// Is just convenience for this:
MY_TABLE.COL.eq(val(1));

// Or rather, this one to be precise
MY_TABLE.COL.eq(val(1, MY_TABLE.COL.getDataType()));

因为将所有内容打包在一起会非常冗长和繁琐,所以为了方便起见,所有jOOQ的API接受也都接受。如果 Java 具有未标记的联合类型,则此类方法的参数类型将为 。val()Field<T>TT|Field<T>

在极少数情况下,用户需要将其绑定值显式包装在 中,包括:val()

  • 当绑定值位于表达式的左侧时
  • 当绑定值用于不支持此类重载的子句中时,例如select()
  • 当具有多个重载的函数需要其中一个参数的类型时Field<T>

所以,只需写:

val(1).eq(MY_TABLE.COL);
val(1).in(MY_TABLE.COL1, MY_TABLE.COL2, MY_TABLE.COL3);
val(1).between(MY_TABLE.COL1).and(MY_TABLE.COL2);

请注意,还有 DSL.inline(T) 来创建“内联值”,或者还有“常量”、“文本”,而不是绑定值。

另请参阅:


答案 2

推荐