3.17.0版本包含計算列、審計列、模式匹配、反應式事務和Kotlin Coroutine支援

語言: CN / TW / HK

這個版本延續了前幾個版本的工作,圍繞更復雜的SQL轉換功能,包括:

  • 用於讀和寫操作的客戶端計算列
  • 審計列
  • 模式匹配的SQL轉換
  • 更多的隱式 JOIN 功能

客戶端計算列

在所有商業發行版中,一個突破性的新核心功能是,新的客戶端計算列功能,建立在jOOQ 3.16的
商業支援的只讀列和伺服器端計算列之上。

並非所有的RDBMS都支援計算列(例如使用標準的SQL語法 GENERATED ALWAYS AS ),如果它們支援,它們可能不支援STORED (寫時計算)和VIRTUAL (讀時計算)這兩種變體。jOOQ現在可以在客戶端模擬這兩種功能,通過轉換你的SQL查詢:

  • STORED 影響 , , , 和INSERT UPDATE DELETE MERGE
  • VIRTUAL 影響 和DML語句的 子句。要利用這些功能,請將它們與新的合成列生成功能相結合。SELECT RETURNING

與伺服器端的對應功能不同,這些客戶端的功能可以產生任意的表示式,包括:

  • 隱式連線
  • 標量子查詢
  • MULTISET 子查詢
  • 更多

可以把它看作是用jOOQ編寫的 "檢視",以每一列為基礎。一個特別有用的功能組合是將這些計算列與新的可見性修改器結合起來,允許保持計算列(或基礎列)的私有性,從而使使用者程式碼看不見。

審計列

STORED 客戶端計算列的一個特殊情況是審計列,其最基本的實現形式是:

  • CREATED_AT
  • CREATED_BY
  • MODIFIED_AT
  • MODIFIED_BY

存在其他的審計方法,包括軟刪除,額外的元資料,(雙)時間版本,但這些列是最流行的方法之一,使這個商業上唯一的便利功能對很多客戶非常有用。

jOOQ開源版的Java 17基線

Java 17已經是最新的LTS,它包括很多非常酷的功能,包括:

  • 密封型別(對模式匹配至關重要)
  • 記錄
  • instanceof模式匹配
  • 文字塊
  • 開關表示式

jOOQ 3.16的實驗性新查詢物件模型(QOM)API對密封型別進行了實驗,一旦QOM API最終確定,它將被更廣泛地採用。

為了獲得更廣泛的使用者對這些改進的反饋,以及接受Java新的LTS更新節奏,我們決定將Java 17作為jOOQ 3.17開源版的基線,繼續在商業jOOQ發行版中支援Java 8和11。

以下舊的jOOQ版本將繼續接受升級:

  • jOOQ 3.14:最後一個在jOOQ開源版
    中支援Java 8的版本,在jOOQ企業版中支援Java 6。
  • jOOQ 3.15和3.16:jOOQ開源
    版支援Java 11的最後一個版本。

支援PostgreSQL的資料型別

jooq-postgres-extensions模組,包含了對HSTORE 型別的支援,現在對PostgreSQL特定的資料型別有了更多的支援,包括每個的陣列型別:

  • CIDR
  • CITEXT
  • LTREE
  • HSTORE
  • INET
  • RANGE (包括對 , , 等的所有特殊化)INT4 INT8

為了從這些資料型別中獲利,只需在你的程式碼生成和執行時依賴中新增org.jooq:jooq-postgres-extensions 模組,這些型別就會自動生成。

隱式JOIN的改進

在這個版本中,我們試驗了一些新的隱式JOIN功能,包括對DML語句中隱式JOIN的支援。目前的實現產生了相關的子查詢,在DML語句中不支援JOIN。

我們還試驗了為其他常用的相關子查詢建立一個 "方便的語法",例如EXISTS(...) 子查詢或MULTISET(...) 子查詢。這個實驗非常有趣。但是,原型卻被拒絕了,請看這裡的討論:

未來的jOOQ版本將以更多的隱式JOIN功能的形式實現所需的便利性,同時提供隱式to-many JOIN的功能。

原型的一個遺留問題是,你現在可以更容易地在你的SELECT 子句中投射除經典Field<T> 以外的表示式即:

  • Table<R> now extendsSelectField<R>
  • Condition 現在擴充套件Field<Boolean>

這意味著你可以寫一個這樣的查詢:

``` Result> result = ctx.select(

  // Project a CustomerRecord directly
  CUSTOMER,

  // Project an AddressRecord from an implicit JOIN
  CUSTOMER.address(),

  // Project a boolean expression, instead of wrapping it with field()
  exists(
    selectOne()
    .from(PAYMENT)
    .where(PAYMENT.CUSTOMER_ID.eq(CUSTOMER.CUSTOMER_ID))
  )

.from(CUSTOMER) .fetch();

```

模式匹配的SQL轉換

SQL轉換是最近的jOOQ版本的一個戰略性功能集,為商業客戶提供了SQL方言之間的額外相容性,例如:

  • 將Oracle的ROWNUM 轉化為等價的視窗函式或LIMIT 條款。
  • 將包括Oracle的(+) 操作符的表列錶轉為ANSI JOIN語法。

這個版本有一個新的商業功能,在渲染前直接轉換新的查詢物件模型(QOM)的表示式樹。它是通過對錶達式樹應用模式匹配來實現的。一些各種各樣的例子包括:

  • LTRIM(RTRIM(x))TRIM(x)
  • x != a AND x != b 變成x NOT IN (a, b)
  • x IN (a, b, c) AND x IN (b, c, d) 進入x IN (b, c)
  • NOT (NOT (x = 1)) 進入x = 1
  • NOT (x = 1) 進入x != 1

還有更多,這個功能的主要使用情況是:

  • SQL檢查,例如,作為一個ExecuteListener
  • SQL自動清理,包括在ParsingConnection
  • 方言遷移,當升級資料庫版本,或在方言之間移動時
  • 對特定的SQL功能進行修補

反應式和kotlin coroutine支援

很多小的改進已經實現。幾個比較重要的,包括:

  • 現在支援R2DBC 0.9.1.RELEASE。
  • 增加了一個新的反應式事務API,它提供了與現有的阻塞式事務API相同的巢狀
    事務語義,另見:
    https://blog.jooq.org/nested-transactions-in-jooq/
  • 通過Publisher SPI的jOOQ的反應式流繫結現在
    ,在新的
    org.jooq:jooq-kotlin-coroutines 模組中使用通常的utilites
    org.jetbrains.kotlinx:kotlinx-coroutines-core 和 自動橋接到kotlin coroutines。
    org.jetbrains.kotlinx:kotlinx-coroutines-reactor
  • org.jooq:jooq-kotlin 擴充套件模組現在有額外的
    擴充套件函式,以獲得更多的MULTISET 和其他巢狀相關的
    便利。
  • 整個阻塞執行API現在被註釋為
    org.jetbrains.annotations.Blocking ,以幫助反應式jOOQ使用者
    ,避免在使用IntelliJ時意外地阻塞查詢。此外,我們
    ,現在用同一軟體包中的ApiStatus
    註解來註釋實驗性和內部API。