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

在 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);

我怎样才能把这些1or"xyz"变成Field<Integer>orField<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)可以创建“内联值”或“常量”、“文字”,而不是绑定值。

也可以看看:

  • https://www.jooq.org/doc/latest/manual/sql-building/bind-values/indexed-parameters/
  • https://www.jooq.org/doc/latest/manual/sql-building/bind-values/inlined-parameters/

以上是如何从jOOQ中的值T明确创建Field&lt;T&gt;?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>