Java JOOQ查询以连接WITH子句
如何编写JOOQ查询以连接with子句中的字段 例如,我尝试过:Java JOOQ查询以连接WITH子句,java,sql,jooq,with-clause,Java,Sql,Jooq,With Clause,如何编写JOOQ查询以连接with子句中的字段 例如,我尝试过: create.with("a").as(select( val(1).as("x"), val("a").as("y") )) .select() .from(tableByName("a") .join(ANOTHER_TABLE)
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();
但是,由于编译器不知道tableByNamea.fieldx的类型,因此无法解析使用哪个eq方法。既然我知道类型,有没有一种方法可以显式地提供它?或者我是否应该采取另一种方法从with子句加入字段?首先声明CTE如何?
如果这不起作用,您总是可以通过字段获取数据类型或类,您可以通过表格获取。虽然我当然同意这一点,但我将快速添加一个回答,回答您的特定编译错误问题 当前连接谓词有三个错误: 另一个_TABLE.ID.eqtableByNamea.fieldx 不推荐使用。通常建议改用。 这种动态构造的表不知道其任何字段引用,因此tablenamea.fieldx将返回null 编译错误是由于ID引用的类型可能是Field,因此该方法也需要一个Field参数。在不知道字段x的类型的情况下,jooqapi/Java编译器推断字段,这是无效的。 因此,解决方案是写: //字段名,类 另一个_TABLE.ID.eqfieldnamea,x,Integer.class //字段名,数据类型 另一个_TABLE.ID.eqfieldnamea,x,另一个_TABLE.ID.getDataType
即使用,或者如果您使用的是自定义数据类型绑定/转换器。谢谢,但这仍然无法帮助编译器解决要使用哪个eq重载。Lukas使用fieldName的答案是,在传入类型的地方使用类重载。
CommonTableExpression<Record2<Integer, String>> a =
name("a").fields("x", "y").as(select(val(1), val("a")));
create.with(a)
.select()
.from(a)
.join(ANOTHER_TABLE)
.on(ANOTHER_TABLE.ID.eq(a.field("x")))
.fetch();