我想知道是否有一种更优雅的方式来使用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()查询的子句。我希望有类似于预编译语句的参数替换
答案 0 :(得分:238)
您需要参数来源:
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
答案 1 :(得分:51)
我使用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);
答案 2 :(得分:16)
如果您收到以下异常:无效的列类型
请使用getNamedParameterJdbcTemplate()
代替getJdbcTemplate()
List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters,
getRowMapper());
请注意,后两个参数是交换的。
答案 3 :(得分:1)
参考here
使用命名参数编写查询,使用简单的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;
答案 4 :(得分:-5)
自2009年以来,许多事情发生了变化,但我只能找到答案,说你需要使用NamedParametersJDBCTemplate。
对我而言,只要我做一个
就可以了db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));
使用SimpleJDBCTemplate或JDBCTemplate