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

How to make JOOQ to use arrays in the IN clause

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

.where(
   Tables.TABLE.FIELD.in(idsList)
)
  1. 我该怎么做?
  2. 为什么默认情况下不这样做,因为生成(并由 PG 解析)字符串 in (?, ?, ?, ?, ...)
  3. 效率更高

How can I do this?

您可以使用 DSL.any(T[]) 运算符,例如

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

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

Why it's not done by default since it's more efficient that generation (and parsing by PG) of the string

可能值得考虑 Settings 中的标志。我为此注册了一个功能请求:https://github.com/jOOQ/jOOQ/issues/6029

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

选择加入

注意过早优化!

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

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

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