如何使用 Spring 的 JDBCTemplate 有效地执行 IN () SQL 查询?

我想知道是否有一种更优雅的方式来使用 Spring 的 JDBCTemplate 进行 IN ()查询。目前,我正在做类似的事情:

StringBuilder jobTypeInClauseBuilder = new StringBuilder();
for(int i = 0; i < jobTypes.length; i++) {
Type jobType = jobTypes[i];


if(i != 0) {
jobTypeInClauseBuilder.append(',');
}


jobTypeInClauseBuilder.append(jobType.convert());
}

这是非常痛苦的,因为如果我只有9行代码来构建 IN ()查询的子句。我希望有一些类似于准备语句的参数替换的东西

209687 次浏览

您需要一个参数源:

Set<Integer> ids = ...;


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


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

这只有在 getJdbcTemplate()返回类型为 NamedParameterJdbcTemplate的实例时才有效

我使用 spring jdbc 执行“ in 子句”查询,如下所示:

String sql = "SELECT bg.goodsid FROM beiker_goods bg WHERE bg.goodsid IN (:goodsid)";


List ids = Arrays.asList(new Integer[]{12496,12497,12498,12499});
Map<String, List> paramMap = Collections.singletonMap("goodsid", ids);
NamedParameterJdbcTemplate template =
new NamedParameterJdbcTemplate(getJdbcTemplate().getDataSource());


List<Long> list = template.queryForList(sql, paramMap, Long.class);

如果您得到一个异常: 无效的列类型

请使用 getNamedParameterJdbcTemplate()代替 getJdbcTemplate()

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

请注意,后两个参数是交换的。

在这里请参考 < a href = “ https://web.archive./web/20181219121911/http://forum.spring.io/forum/spring-Projects/batch/76237-jdbccursoritemreader-with-name-properties”rel = “ nofollow noReferrer”>

使用命名参数写查询,使用简单的 ListPreparedStatementSetter,按顺序输入所有参数。只需添加下面的代码片段,将传统形式的查询转换为可用参数,

ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(namedSql);


List<Integer> parameters = new ArrayList<Integer>();
for (A a : paramBeans)
parameters.add(a.getId());


MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("placeholder1", parameters);
// create SQL with ?'s
String sql = NamedParameterUtils.substituteNamedParameters(parsedSql, parameterSource);
return sql;

自2009年以来,很多事情都发生了变化,但是我只能找到答案,说明您需要使用 NamedParameter tersJDBCTemplate。

对我来说,只要我做一个

db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));

使用 SimpleJDBCTemplate 或 JDBCTemplate