jdbctemplate动态查询参数限制是多少?

What is the jdbctemplate dynamic query parameters limit?

我正在尝试对我的 PostgreSQL 数据库执行读取操作。我正在使用 SpringTemplate 并将动态参数传递给它。

"SELECT id, name FROM Student WHERE id IN :id"

这里,id=(1,2,3,4,5...)

在不中断 JDBC 连接并使操作顺利进行的情况下,我最多可以在 ID 中传递多少元素?

郑重声明,我认为 JdbcTemplate 方面没有任何问题

“工作顺利”是相当主观的。但我发现 starting with 64 bind values, arrays seem to outperform in lists in PostgreSQL

无论如何,有一个hard limit of 32767 parameters per statement in PostgreSQL

现在,在很多情况下,您的 ID 列表是另一个查询的结果。如果该列表未在 UI 中手动修改(例如,通过一组复选框),那么为什么不重复该原始查询并将您的 IN 谓词转换为半连接?例如

SELECT id, name 
FROM Student
WHERE id IN (
  SELECT id
  FROM some_other_query
  WHERE some_previous_predicate
)

为 IN 子句传递值列表

SQL 标准允许selecting 基于包含可变值列表的表达式的行。一个典型的例子是 select * from T_ACTOR where id in (1, 2, 3)。 JDBC 标准不直接支持此变量列表;您不能声明可变数量的占位符。您需要准备一些具有所需占位符数量的变体,或者一旦知道需要多少占位符,就需要动态生成 SQL 字符串。 NamedParameterJdbcTemplate 和 SimpleJdbcTemplate 中提供的命名参数支持采用后一种方法。将值作为原始对象的 java.util.List 传递。该列表将用于插入所需的占位符并在语句执行期间传入值。

备注

传入多个值时要小心。 JDBC 标准不保证 您可以为 in 表达式列表使用超过 100 个值。各种数据库都超过了这个数字,但它们通常对允许的值数量有一个硬性限制。 Oracle 的限制是 1000.

除了值列表中的原始值,您还可以创建 java.util.List 对象数组。此列表将支持为 in 子句定义的多个表达式,例如 select * from T_ACTOR where (id, last_name) in ((1, 'Johnson'), (2, 'Harrop'))。这当然需要你的数据库支持这种语法。

请参阅此LINK了解更多详情。