![](/img/trans.png)
[英]How to do IN() and WHERE=? SQL queries with Spring's JDBCTemplate
[英]How to execute IN() SQL queries with Spring's JDBCTemplate effectively?
我想知道是否有更优雅的方法来使用 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());
}
这是非常痛苦的,因为如果我有九行只是为了构建 IN() 查询的子句。 我想要一些类似准备好的语句的参数替换
你想要一个参数源:
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());
请注意,后两个参数被交换了。
参考这里
使用命名参数编写查询,按顺序使用简单的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 年以来发生了很多变化,但我只能找到说明您需要使用 NamedParametersJDBCTemplate 的答案。
对我来说,如果我只是做一个
db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));
使用 SimpleJDBCTemplate 或 JDBCTemplate
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.