繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM