我希望JOQ可以生成... in (?)
并将列表绑定为数组参数(Postgres)。我的代码如下:
.where(
Tables.TABLE.FIELD.in(idsList)
)
- 我该怎么做?
- 为什么不默认完成这个任务呢?既然生成字符串
in(?,?,?,?,...)
并由PG解析更有效率。
我希望JOQ可以生成... in (?)
并将列表绑定为数组参数(Postgres)。我的代码如下:
.where(
Tables.TABLE.FIELD.in(idsList)
)
in(?,?,?,?,...)
并由PG解析更有效率。我该怎么做?
你可以使用 DSL.any(T[])
操作符,例如:
TABLE.FIELD.eq(any(1, 2, 3))
这将仅将一个数组变量绑定到JDBC语句中。
为什么默认情况下不这样做,因为它比生成(和由PG解析)字符串更有效
也许值得考虑在设置
中添加一个标志。我已经为此注册了一个功能请求:https://github.com/jOOQ/jOOQ/issues/6029
一般来说,jOOQ允许用户编写他们想要发送到数据库服务器的SQL,因此自动“优化”和重写SQL可能会对某些用户产生意外效果。这只是jOOQ的一般规则。始终值得考虑优化并通过设置
使其成为可选项。
IN
列表相比,数组的基数可能更难以正确估计。对于小列表使用数组可能会对执行计划产生负面影响。因此,您在解析器方面节省的几微秒将会抵消执行方面的几毫秒(?)!IN
列表似乎始终优于数组版本,直到长度约为50。TABLE.FIELD.eq(DSL.any(1, 2, 3))
上,我得到了 no suitable method found for in(QuantifiedSelect<Record1<Long>>)
错误。 - Alex Dvoretsky1L, 2L, 3L
呢? - Lukas Eder
in
子句中使用了几个id,但如果你要处理数百个id,请考虑创建一个批量id表。请考虑这一点,因为你永远不知道用户何时会选择数百个不同的项目(例如,想想Gmail复选框)。 - Adam Gent