Ale*_*sky 4 java arrays postgresql jooq
我希望 JOOQ 生成... in (?)
并绑定列表作为数组参数(Postgres)。我的代码看起来像
.where(
Tables.TABLE.FIELD.in(idsList)
)
Run Code Online (Sandbox Code Playgroud)
in (?, ?, ?, ?, ...)
我怎样才能做到这一点?
您可以使用DSL.any(T[])
运算符,例如
TABLE.FIELD.eq(any(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)
这将仅将一个数组变量绑定到 JDBC 语句
为什么默认情况下不这样做,因为它更有效地生成(并由 PG 解析)字符串
可能值得考虑在Settings
. 我已经为此注册了一个功能请求: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/
该IN
列表似乎始终优于数组版本(在我的特定基准案例中),直到长度约为 50