Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jdbc模板故障保护IN语句_Java_Spring_Jdbctemplate - Fatal编程技术网

Java jdbc模板故障保护IN语句

Java jdbc模板故障保护IN语句,java,spring,jdbctemplate,Java,Spring,Jdbctemplate,是否有一种使用Spring的jdbc模板获得多行的方法是故障安全的? 在这篇文章中: 设置id=。。。; MapSqlParameterSource参数=新的MapSqlParameterSource(); 参数。addValue(“ids”,ids); List foo=getJdbcTemplate().query(“在(:id)中的foo中选择*”, getRowMapper(),参数); 但是能够返回所有ID,而不考虑DB对参数数量的限制。因此,如果DB只能接受IN子句中的2000个

是否有一种使用Spring的jdbc模板获得多行的方法是故障安全的? 在这篇文章中:

设置id=。。。;
MapSqlParameterSource参数=新的MapSqlParameterSource();
参数。addValue(“ids”,ids);
List foo=getJdbcTemplate().query(“在(:id)中的foo中选择*”,
getRowMapper(),参数);

但是能够返回所有ID,而不考虑DB对参数数量的限制。因此,如果DB只能接受IN子句中的2000个参数,并且我通过了2001,我将获得2001个记录。

您可以借助临时表来完成此操作,其中首先需要创建它,然后转储其上值中的所有值。稍后,您需要在联接或子查询中使用该表,以便与您最初希望在其中使用的主表相关联。完整的JDBCTemplate代码可以在这里找到

您可以通过将参数列表分成大约100个或更多的小批量来完成。我记得我曾经编写过一段类似的代码,其中我基于批次计数创建了一个动态选择查询,并传递了总参数的一个子集。例如,在2001记录的情况下,我的函数将创建21个查询,例如
SELECT*FROM WHERE In(?,,?)
我是(非常激进的)参数用户(在查询中),但一系列int的In子句“In”将连接为字符串(当然在Java中使用StringBuilder),因此最终的查询字符串是:

"SELECT * FROM foo WHERE a IN (215, 567, 957, 1298)"
需要明确的是:在基于枚举而非从属表的情况下,这是不同的情况


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

谢谢,我想避免使用临时表,但我想唯一的另一个选择是分批执行,每次选择500个ID左右,然后将它们合并在一起。无论是临时表还是分批执行都是正确的。
"SELECT * FROM foo WHERE a IN (215, 567, 957, 1298)"