我希望JOOQ生成... in (?)
并将列表绑定为数组参数(Postgres)。我的代码看起来像
.where(
Tables.TABLE.FIELD.in(idsList)
)
in (?, ?, ?, ?, ...)
答案 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的长度