簡體   English   中英

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”子句中的字段?

我當然同意flutter的回答是在這里找到解決方案的更理想的途徑 ,但是我將快速添加一個回答,以回答您的特定編譯錯誤問題。

當前的連接謂詞有三件事是錯誤的:

ANOTHER_TABLE.ID.eq(tableByName("a").field("x"))
  1. DSL.tableByName()已棄用。 通常建議改用table(Name)
  2. 這種動態構造的Table不知道其任何field()引用,因此table(name("a")).field("x")將返回null
  3. 編譯錯誤是由於您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM