这个版别延续了前几个版别的工作,围绕更杂乱的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(...) 子查询。这个试验十分风趣。可是,原型却被拒绝了,请看这里的评论:

  • github.com/jOOQ/jOOQ/i…
  • github.com/jOOQ/jOOQ/i…

未来的jOOQ版别将以更多的隐式JOIN功用的方式完成所需的便当性,同时供给隐式to-many JOIN的功用。

原型的一个遗留问题是,你现在能够更容易地在你的SELECT 子句中投射除经典Field<T> 以外的表达式即:

  • Table<R> now extendsSelectField<R>
  • Condition 现在扩展Field<Boolean>

这意味着你能够写一个这样的查询:

Result<Record3<CustomerRecord, AddressRecord, Boolean>> 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相同的嵌套
    业务语义,另见:
    blog.jooq.org/nested-tran…
  • 经过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。