如何明确地从 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);
以上所有方法都接受 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);
如何将 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)
可以创建“内联值”,或者“常量”、“文字”,而不是绑定值。
另请参阅:
在 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);
如何将 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)
可以创建“内联值”,或者“常量”、“文字”,而不是绑定值。
另请参阅: