如何让 JOOQ 在 IN 子句中使用数组

2023-12-24

我想要JOOQ生成... in (?)并将列表绑定为数组参数(Postgres)。我的代码看起来像

.where(
   Tables.TABLE.FIELD.in(idsList)
)
  1. 我怎样才能做到这一点?
  2. 为什么默认情况下不这样做,因为它比字符串的生成(和由 PG 解析)更有效in (?, ?, ?, ?, ...)

我怎样才能做到这一点?

您可以使用DSL.any(T[]) https://www.jooq.org/javadoc/latest/org/jooq/impl/DSL.html#any-T...-运算符,例如

TABLE.FIELD.eq(any(1, 2, 3))

这只会将一个数组变量绑定到 JDBC 语句

为什么默认情况下不这样做,因为它比字符串的生成(和由 PG 解析)更有效

可能值得考虑一下国旗Settings。我已经为此注册了一个功能请求:https://github.com/jOOQ/jOOQ/issues/6029 https://github.com/jOOQ/jOOQ/issues/6029

一般来说,jOOQ允许用户准确地编写他们想要发送到数据库服务器的SQL,因此自动“优化”和重写SQL对于某些用户来说可能显得非常出乎意料。这只是 jOOQ 中的一般经验法则。始终值得考虑优化并让他们选择加入Settings.

注意过早优化!

然而,实际测量这些东西总是很重要的。虽然使用您建议的方法肯定会减少解析和 SQL 生成开销,但请注意,数组的基数可能比硬连线的基数更难正确估计IN列表。对小列表使用数组可能会对您的执行计划产生负面影响。因此,您在解析器端节省的几微秒将与执行端的几毫秒(?)相比!

我在以下博客文章中对此进行了基准测试:https://blog.jooq.org/sql-in-predicate-with-in-list-or-with-array-which-is-faster/ https://blog.jooq.org/sql-in-predicate-with-in-list-or-with-array-which-is-faster/

The IN列表似乎始终优于数组版本(在我的具体基准案例中)直到长度约为50

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 JOOQ 在 IN 子句中使用数组 的相关文章

随机推荐