如何编写 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();
但是,由于编译器不知道 tableByName("a").field("x") 的类型,因此无法解析要使用哪个 eq() 方法。鉴于我知道类型,有没有办法可以明确提供它?或者我应该采取另一种方法从“with”子句加入字段?
虽然我当然同意flutter 的答案是更理想的解决方案 https://stackoverflow.com/a/44486088/521799在这里,我将快速添加一个响应来回答您的特定编译错误问题。
您当前的连接谓词存在三个问题:
ANOTHER_TABLE.ID.eq(tableByName("a").field("x"))
-
DSL.tableByName() https://www.jooq.org/javadoc/latest/org/jooq/impl/DSL.html#tableByName-java.lang.String...-已弃用。一般建议使用table(Name) https://www.jooq.org/javadoc/latest/org/jooq/impl/DSL.html#table-org.jooq.Name-反而。
- 这样一个动态构造的
Table
不知道其任何field()
参考文献,因此table(name("a")).field("x")
将返回null
- 编译错误是由于你的
ID
引用类型Field<Integer>
(可能),因此Field.eq() https://www.jooq.org/javadoc/latest/org/jooq/Field.html#eq-org.jooq.Field-方法期望一个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()))
IE。使用DSL.field(Name, Class<T>) https://www.jooq.org/javadoc/latest/org/jooq/impl/DSL.html#field-org.jooq.Name-java.lang.Class-, or DSL.field(Name, DataType<T>) https://www.jooq.org/javadoc/latest/org/jooq/impl/DSL.html#field-org.jooq.Name-org.jooq.DataType-如果您使用自定义数据类型绑定/转换器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)