我正在尝试做类似的事情:
t.set(field("ColumnName"), select(max(field("ColumnName"))).from("TableName"));
但是我收到以下编译错误:
Ambiguous method call, Both
set(Field,Object) in InsertSetStep and
set(Field,Select<? extends Record1>) in InsertSetStep match
我已尝试通过投射解决歧义,但仍然收到相同的错误
Select<? extends Record1> sq = select(max(field("ColumnName"))).from("TableName");
t.set( field("ColumnName"), (Select<? extends Record1>)sq );
我有几个问题:
(Object)
,但这确实解决了歧义)答案 0 :(得分:1)
这是非常不幸的,但是Java语言和各种编译器的指定行为。在使用泛型时,采用Select
类型的方法将为您的特定调用更具体,但一旦涉及泛型,它就不再如此。 The rationale can be seen here。
像jOOQ一样,没有太多的通用且重载的API,但是作为用户,您可以。在这种情况下,您必须避免使用代码生成器或手动传递数据类型将<T>
绑定到Object
:
// Assuming this is an INTEGER type
t.set(
field("ColumnName", SQLDataType.INTEGER),
select(max(field("ColumnName", SQLDataType.INTEGER))).from("TableName"));
或者,您开始将列引用存储在一些静态变量中,例如:
Field<Integer> COLUMN_NAME = field("ColumnName", SQLDataType.INTEGER);
// And then:
t.set(COLUMN_NAME, select(max(COLUMN_NAME)).from("TableName"));
注意,当您使用代码生成器时,这几乎不会出现问题,在这种情况下,您具有绑定到<T>
引用的Field<T>
类型的特定类型信息,对于重载将不再同时适用。
I really recommend you use the code generator for this reason (and for many others)。