[英]How to execute IN() SQL queries with Spring's JDBCTemplate effectively?
I was wondering if there is a more elegant way to do IN() queries with Spring's JDBCTemplate.我想知道是否有更优雅的方法来使用 Spring 的 JDBCTemplate 进行 IN() 查询。 Currently I do something like that:
目前我做这样的事情:
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());
}
Which is quite painful since if I have nine lines just for building the clause for the IN() query.这是非常痛苦的,因为如果我有九行只是为了构建 IN() 查询的子句。 I would like to have something like the parameter substitution of prepared statements
我想要一些类似准备好的语句的参数替换
You want a parameter source:你想要一个参数源:
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());
This only works if getJdbcTemplate()
returns an instance of type NamedParameterJdbcTemplate
这仅在
getJdbcTemplate()
返回NamedParameterJdbcTemplate
类型的实例时有效
I do the "in clause" query with spring jdbc like this:我像这样使用 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);
If you get an exception for: Invalid column type如果您收到以下异常:无效的列类型
Please use getNamedParameterJdbcTemplate()
instead of getJdbcTemplate()
请使用
getNamedParameterJdbcTemplate()
而不是getJdbcTemplate()
List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters,
getRowMapper());
Note that the second two arguments are swapped around.请注意,后两个参数被交换了。
write query with named parameter, use simple ListPreparedStatementSetter
with all parameters in sequence.使用命名参数编写查询,按顺序使用简单的
ListPreparedStatementSetter
和所有参数。 Just add below snippet to convert the query in traditional form based to available parameters,只需添加以下代码片段即可根据可用参数将传统形式的查询转换为
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;
Many things changed since 2009, but I can only find answers saying you need to use NamedParametersJDBCTemplate.自 2009 年以来发生了很多变化,但我只能找到说明您需要使用 NamedParametersJDBCTemplate 的答案。
For me it works if I just do a对我来说,如果我只是做一个
db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));
using SimpleJDBCTemplate or JDBCTemplate使用 SimpleJDBCTemplate 或 JDBCTemplate
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.