eoi*_*lan 4 java sql with-clause jooq
如何编写 JOOQ 查询来连接“with”子句中的字段?
例如,我尝试过:
create.with("a").as(select(
val(1).as("x"),
val("a").as("y")
))
.select()
.from(tableByName("a")
.join(ANOTHER_TABLE)
.on(ANOTHER_TABLE.ID.eq(tableByName("a").field("x")))
.fetch();
Run Code Online (Sandbox Code Playgroud)
但是,由于编译器不知道 tableByName("a").field("x") 的类型,因此无法解析要使用哪个 eq() 方法。鉴于我知道类型,有没有办法可以明确提供它?或者我应该采取另一种方法从“with”子句加入字段?
虽然我当然同意flutter 的答案是这里更理想的解决方案,但我将快速添加一个响应来回答您的特定编译错误问题。
您当前的连接谓词存在三个问题:
ANOTHER_TABLE.ID.eq(tableByName("a").field("x"))
Run Code Online (Sandbox Code Playgroud)
DSL.tableByName()已弃用。一般建议使用table(Name)。Table不知道它的任何field()引用,因此table(name("a")).field("x")将返回nullID引用类型Field<Integer>(可能)所致,因此该方法也Field.eq()需要一个参数。Field<Integer>在不了解字段类型的情况下"x",jOOQ API/Java 编译器会进行推断Field<Object>,这是无效的。所以,解决方案是这样写:
// field(Name, Class)
ANOTHER_TABLE.ID.eq(field(name("a", "x"), Integer.class))
// field(Name, DataType)
ANOTHER_TABLE.ID.eq(field(name("a", "x"), ANOTHER_TABLE.ID.getDataType()))
Run Code Online (Sandbox Code Playgroud)
即使用DSL.field(Name, Class<T>),或者DSL.field(Name, DataType<T>)如果您使用自定义数据类型绑定/转换器。
| 归档时间: |
|
| 查看次数: |
3966 次 |
| 最近记录: |