如何明确地从 jOOQ 中的值 T 创建 Field<T>?

How do I create a Field<T> from a value T in jOOQ, explicitly?

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

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

以上所有方法都接受 TField<T> 类型,例如Field.eq(T) or Field.eq(Field<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 邮件列表等上的一个非常受欢迎的问题,所以我在这里记录它)

接受T的方法只是方便的方法。在幕后,他们都将 T 参数包装在 DSL.val(T)

// 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()));

因为将所有内容都包装在 val() 中会非常冗长和繁琐,为了方便起见,jOOQ 的所有 API 接受 Field<T> 也接受 T。如果 Java 具有未标记的联合类型,则此类方法的参数类型将为 T|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) 可以创建“内联值”,或者“常量”、“文字”,而不是绑定值。

另请参阅: