[英]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”子句中的字段?
我當然同意flutter的回答是在這里找到解決方案的更理想的途徑 ,但是我將快速添加一個回答,以回答您的特定編譯錯誤問題。
當前的連接謂詞有三件事是錯誤的:
ANOTHER_TABLE.ID.eq(tableByName("a").field("x"))
DSL.tableByName()
已棄用。 通常建議改用table(Name)
。 Table
不知道其任何field()
引用,因此table(name("a")).field("x")
將返回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>)
或DSL.field(Name, DataType<T>)
。
首先宣布CTE怎么樣? 顯式公用表表達式
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
獲取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.