jdbc 模板故障保护 IN 语句

jdbc template failsafe IN statement

有没有一种方法可以使用 Spring 的 jdbc 模板来获取多行,该模板是万无一失的? 像这样 post:

Set<Integer> ids = ...;

MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("ids", ids);

List<Foo> foo = getJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",
     getRowMapper(), parameters);

但能够 return 所有 ID,而不管数据库对参数数量的限制。因此,如果数据库只能在 IN 子句中接受 2000 个参数,而我传递的是 2001,我将获得 2001 条记录。

您可以在 temporary tables 的帮助下执行此操作,其中首先您需要创建它,然后将所有值 IN 值转储到它上面。稍后您需要在连接或子查询中使用 table 与您最初想要 IN 调用的主 table 相关联。可以在此处找到完整的 JDBCTemplate 代码 http://forum.spring.io/forum/spring-projects/data/63634-spring-jdbc-and-sybase-temp-tables

您可以通过将参数列表分成大约 100 个或更多的较小批次来实现。我记得我写过一个类似的代码,我在其中创建了一个基于批次计数并传递总参数的子集的动态 select 查询。例如,对于 2001 条记录,我的函数会创建 21 个查询,例如 SELECT * FROM <table> WHERE <column> IN (?,..<batchSize>..,?).

我是(非常激进的)参数用户(在查询中),但是子句 "in" 中的一系列 int 我连接为字符串(当然在 Java 中使用 StringBuilder),所以最终查询字符串是:

"SELECT * FROM foo WHERE a IN (215, 567, 957, 1298)"

需要说明的是:IN 基于枚举,与 slave 无关 table,这是不同的故事

查询字符串长度的限制很大(数据库不同?可能是)