java—如何使用spring的jdbctemplate有效地执行in()sql查询?

gmol1639  于 2021-07-23  发布在  Java
关注(0)|答案(5)|浏览(508)

我想知道是否有一种更优雅的方法可以使用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()查询的子句。我想要一些类似于准备语句的参数替换

jogvjijk

jogvjijk1#

需要参数源:

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

pqwbnv8z

pqwbnv8z2#

我使用SpringJDBC执行“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);
rmbxnbpk

rmbxnbpk3#

如果出现异常:列类型无效
请使用 getNamedParameterJdbcTemplate() 而不是 getJdbcTemplate() ```
List foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters,
getRowMapper());

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

ct3nt3jp4#

请参阅此处
使用命名参数编写查询,使用simple 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;
x6h2sr28

x6h2sr285#

自2009年以来,很多事情都发生了变化,但我只能找到答案说您需要使用namedparametersjdbctemplate。
对我来说,如果我只是做一个

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

使用simplejdbctemplate或jdbctemplate

相关问题