Spring JDBC模板的新手,但我想知道我是否能够为列表中的每个参数传递一个参数列表并执行一次查询。我已经看过很多例子,传递的参数列表是用于使用提供的所有参数执行查询。相反,我尝试多次执行查询,并且每次都使用列表中的新参数。
例如: 让我们说我有一个ID列表 - params(字符串)
List<String> params = new ArrayList<String>();
params.add("1234");
params.add("2345");
尝试做类似的事情:
getJdbcTemplate().query(sql, params, new CustomResultSetExtractor());
根据文档,我不知道。我的意思是一个它必须是一个数组。我已经看到了简单的示例,其中查询类似于"select * from employee where id = ?"
,并且它们将new Object[]{"1234"}
传递给方法。我试图避免IN()条件。在我的情况下,每个id将返回多行,这就是我使用ResultSetExtractor的原因。
我知道一个选项是迭代列表并将列表中的每个id作为参数包含在内,如:
for(String id : params){
getJdbcTemplate().query(sql, new Object[]{id}, new CustomResultSetExtractor());
}
只是想知道我是否可以通过其他方式做到这一点。对不起,我应该提一下,我正在努力做一个选择。最初希望返回每个结果集的自定义对象列表。
答案 0 :(得分:2)
您需要为API传递一系列参数,但您也可以假设您的第一个参数是一个数组。我相信这应该有效:
String sql = "select * from employee where id in (:ids)"; // or should there be '?'
getJdbcTemplate().query(sql, new Object[]{params}, new CustomResultSetExtractor());
或者您可以明确指定参数是数组
getJdbcTemplate().query(sql, new Object[]{params}, new int[]{java.sql.Types.ARRAY}, new CustomResultSetExtractor());
答案 1 :(得分:1)
我知道您不想使用in子句,但我认为它是解决您问题的最佳方案。
如果你以这种方式使用for,我认为这不是最佳的。
for(String id : params){
getJdbcTemplate().query(sql, new Object[]{id}, new CustomResultSetExtractor());
}
我认为使用in子句是一个更好的解决方案。然后使用ResultSetExtractor迭代结果数据。您的提取器可以返回Map而不是List,实际上是List of Map。
Map<Integer, List<MyObject>>
这里有一个简单的教程解释其用途
http://pure-essence.net/2011/03/16/how-to-execute-in-sql-in-spring-jdbctemplate/
答案 2 :(得分:0)
您可以使用preparedStatement并执行批处理作业:
例如。来自http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html
Bar
答案 3 :(得分:0)
我认为这是最好的解决方案:
public List<TestUser> findUserByIds(int[] ids) {
String[] s = new String[ids.length];
Arrays.fill(s, "?");
String sql = StringUtils.join(s, ',');
return jdbcTemplate.query(String.format("select * from users where id in (%s)", sql),
ArrayUtils.toObject(ids), new BeanPropertyRowMapper<>(TestUser.class));
}
这也许是您想要的。 BeanPropertyRowMapper
仅举例来说,当有很多记录时,它会非常慢。您应该将其更改为另一个更高效的RowMapper。