这个版本解决了用户长期以来要求我们提供的两个复杂的功能要求:一个用于操作jOOQ查询对象模型(QOM)的公共API,以及空间支持。
新的查询对象模型(QOM)
每个jOOQ查询都被建模为通过我们直观的DSL构建的表达式树。对于某些用例来说,存在着历史性的模型API版本(例如:SelectQuery ),但这些模型是不可读的,也是可转换的。我们现在开始将大部分表达式树模型作为公共API提供给用户使用和操作。每个表达式树元素在
[org.jooq.impl.QOM](https://www.jooq.org/javadoc/3.16.0/org.jooq/org/jooq/impl/QOM.html) 中都有一个相应的类型。
每个类型都使用"$"前缀的方法名提供对其组件的访问,例如:
// Create an expression using the DSL API:
Field field = substring(BOOK.TITLE, 2, 4);
// Access the expression's internals using the model API
if (field instanceof QOM.Substring substring) {
Field string = substring.$string();
Field startingPosition = substring.$startingPosition();
Field length = substring.$length();
}
新的API是实验性的,在下一个小版本中可能会有变化。
获得许可的高级用户将获得用于遍历和转换表达式树的辅助API,例如:遍历
// Contains 7 query parts
long count2 = BOOK.ID.eq(1).or(BOOK.ID.eq(2))
.$traverse(Traversers.collecting(Collectors.counting());
或替换:
// Contains redundant operators
Condition c = not(not(BOOK.ID.eq(1)));
System.out.println(c.$replace(q ->
q instanceof QOM.Not n1 && n1.$arg1() instanceof QOM.Not n2
? n2.$arg1()
: q
));
在删除了多余的NOT运算符后,上面打印出了下面的内容:
"BOOK"."ID" = 1
这个新的API对于更复杂的动态SQL用例来说是非常强大的,比如说:
- 优化SQL表达式,如上面的NOT NOT的例子
- 行级安全
- 软删除
- 共享模式的多租户
- 支持审计列
- 还有更多(请继续关注未来的博客和开箱即用的转换)
欲了解更多信息,请参见:
空间支持
一个期待已久的功能,开始向我们的商业授权客户发货,就是空间支持。许多方言都支持ISO/IEC 13249-3:2016SQLstandard扩展,最后,我们也支持。
jOOQ为GEOMETRY和GEOGRAPHY数据引入了新的辅助数据类型,作为标准化的绑定变量使用,包含WKB或WKT数据,以及 各种开箱即用的函数和谓词。未来的版本将增加对其他函数和方言的支持。
新的方言和版本
另一种新的官方支持的SQL方言已被添加到所有jOOQ版本中,包括jOOQ开源版。YugabyteDB。这是一个被赞助的整合,非常感谢Yugabyte!
其他方言有升级的版本,也就是说:
- 我们现在在所有版本中都支持这个版本
- jOOQ开源版现在需要这个版本(如果适用)。
这些版本是:
- Firebird 4.0
- H2 2.0.202
- MariaDB 10.6
- PostgreSQL 14
- Oracle 21c
包括ROWID的计算列和只读列
很多方言都支持计算列("生成 "列),我们现在在jOOQ中也支持这些列。对于大多数使用情况,这并不影响jOOQ的使用,但特别是在编写CRUD代码时, 新的只读列功能可
很好地避免 在CRUD操作中手动排除计算列。
这还包括一个新的、改进的ROWID支持,在执行CRUD操作时,用户可以选择使用一个合成的ROWID列,而不是键。所有这些功能都可以在商业版的jOOQ中使用。
雅加达EE
我们已经从Java EE转移到了Jakarta EE的依赖性。这种改变目前是向后不兼容的,因为:
- 它大大促进了相关代码的维护
- 它防止了因同时依赖两种软件而产生的大量用户问题
- 我们实际上没有与Java EE/Jakarta EE紧密集成。
下列Jakarta EE模块受到影响:
- JAXB,我们用它来加载我们的配置对象。
- Validation,它的注解可以由代码生成器生成。
- JPA,它被DefaultRecordMapper和JPADatabase使用。
如果这个突破性的变化引起了问题,请与我们联系:github.com/jOOQ/jOOQ/i…
各种改进
和每个小版本一样,很多小的改进已经被实现了。一些亮点包括:
- 在代码生成和运行时,现在支持PostgreSQL程序。
- 增加了对 SQLite JSON 的支持,其中包括 MULTISET 仿真!
- 实现了大量的MULTISET/ROW改进。
- R2DBC 0.9已经发布,我们已经升级了我们的依赖性
- Java 17发行版现在需要Java 17而不是Java 16
- 删除了jOOQ 3.6之前的缺失。