JOOQ 查询 JOIN ON WITH 子句
JOOQ query to JOIN ON WITH clause
如何编写 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" 子句加入字段吗?
先声明CTE怎么样?
Explicit common table expressions
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();
如果这不起作用,您始终可以通过 Field
获取 DataType<?>
或 Class<?>
,您可以通过 Table
.
虽然我当然同意 在这里,但我将快速添加一个回复来回答您的特定编译错误问题。
您当前的连接谓词存在三处错误:
ANOTHER_TABLE.ID.eq(tableByName("a").field("x"))
DSL.tableByName()
is deprecated. It is generally recommended to use table(Name)
代替。
- 这样一个动态构造的
Table
不知道它的任何 field()
引用,因此 table(name("a")).field("x")
将 return null
- 编译错误是由于您的
ID
引用类型为 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()))
即如果您使用自定义数据类型绑定/转换器,请使用 DSL.field(Name, Class<T>)
, or DSL.field(Name, DataType<T>)
。
如何编写 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" 子句加入字段吗?
先声明CTE怎么样? Explicit common table expressions
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();
如果这不起作用,您始终可以通过 Field
获取 DataType<?>
或 Class<?>
,您可以通过 Table
.
虽然我当然同意
您当前的连接谓词存在三处错误:
ANOTHER_TABLE.ID.eq(tableByName("a").field("x"))
DSL.tableByName()
is deprecated. It is generally recommended to usetable(Name)
代替。- 这样一个动态构造的
Table
不知道它的任何field()
引用,因此table(name("a")).field("x")
将 returnnull
- 编译错误是由于您的
ID
引用类型为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()))
即如果您使用自定义数据类型绑定/转换器,请使用 DSL.field(Name, Class<T>)
, or DSL.field(Name, DataType<T>)
。