解决您的问题
您可以使用DSL.val()(通常首选)或DSL.inline()将T 类型的任何值转换为Field<T> 类型的表达式
现状说明
在支持类型别名和无标签联合的语言(例如 TypeScript、Ceylon)中,jOOQ API 可以这样定义:
// All of these are "column expressions"
type F<T> = T | Field<T> | Select<? extends Record1<T>> | ...;
interface DSLContext {
<T1> XYZ<Record1<T1>> select(F<T1> field1);
<T1, T2> XYZ<Record1<T1, T2>> select(F<T1> field1, F<T2> field2);
<T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(F<T1> field1, F<T2> field2, F<T3> field3);
}
但不幸的是,Java 不支持这一点。我们必须模仿上面的唯一选项,这将允许在参数列表中混合Field<T> 和T 将是大量的重载(N^22 与 N = F<T> 中的类型数和 22 是jOOQ 的类型安全支持的最大程度):
interface DSLContext {
// Still fine
<T1> XYZ<Record1<T1>> select(T1 f1);
<T1> XYZ<Record1<T1>> select(Field<T1> f1);
// OK-ish
<T1, T2> XYZ<Record1<T1, T2>> select(T1 f1, T2 f2);
<T1, T2> XYZ<Record1<T1, T2>> select(T1 f1, Field<T2> f2);
<T1, T2> XYZ<Record1<T1, T2>> select(Field<T1> f1, T2 f2);
<T1, T2> XYZ<Record1<T1, T2>> select(Field<T1> f1, Field<T2> f2);
// Problems start here
<T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(T1 f1, T2 f2, T3 f3);
<T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(T1 f1, T2 f2, Field<T3> f3);
<T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(T1 f1, Field<T2> f2, T3 f3);
<T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(T1 f1, Field<T2> f2, Field<T3> f3);
<T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(Field<T1> f1, T2 f2, T3 f3);
<T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(Field<T1> f1, T2 f2, Field<T3> f3);
<T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(Field<T1> f1, Field<T2> f2, T3 f3);
<T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(Field<T1> f1, Field<T2> f2, Field<T3> f3);
}
由于这种令人望而却步的复杂性,jOOQ 通常只为“所有绑定值”或“所有表达式”提供 API。在select() 的情况下,“所有绑定变量”的情况非常罕见,我们决定省略它:
interface DSLContext {
<T1> XYZ<Record1<T1>> select(Field<T1> f1);
<T1, T2> XYZ<Record1<T1, T2>> select(Field<T1> f1, Field<T2> f2);
<T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(Field<T1> f1, Field<T2> f2, Field<T3> f3);
}