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

我想知道是否有一个更优雅的方式来使用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()查询构build子句。 我想有像预先准备的语句的参数replace的东西

你想要一个参数源:

 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()返回NamedParameterJdbcTemplatetypes的实例

我用这样的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); 

如果您遇到以下情况的exception:列types无效

请使用getNamedParameterJdbcTemplate()而不是getJdbcTemplate()

  List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters, getRowMapper()); 

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

参考这里

用命名参数写查询,按顺序使用简单的ListPreparedStatementSetter和所有参数。 只需在下面的代码片段中将基于传统forms的查询转换为可用的参数,

 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年以来,但我只能find答案说你需要使用NamedParametersJDBCTemplate。

对我来说,如果我只是做一个,它就会有效

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

使用SimpleJDBCTemplate或JDBCTemplate