如何从jOOQ中的值T明确创建Field<T>?
在 jOOQ 中,很容易在表达式中使用绑定变量,例如:
MY_TABLE.COL.eq(1);
MY_TABLE.COL.in(1, 2, 3);
MY_TABLE.COL.between(1).and(10);
以上所有方法都接受T和Field<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/