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

时间:2017-03-29 16:32:17

标签: java arrays postgresql jooq

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

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

1 个答案:

答案 0 :(得分:3)

  

我该怎么做?

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

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

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

  

为什么默认情况下没有这样做,因为它对字符串的生成(以及PG的解析)效率更高

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

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

关于过早优化的警告!

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

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

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