如何在NamedParameterJdbcTemplate中使用IN查询?
在NamedParameterJdbcTemplate中正确使用IN查询的方法
你之前的问题核心是参数传递方式错误——直接传入拼接好的字符串无法被NamedParameterJdbcTemplate正确解析为IN子句的多个值。正确的做法是给:surname参数传入List类型的集合,而不是拼接后的字符串。
修正后的代码示例
首先调整方法实现(移除重复定义的sql变量,确保使用兼容的JDBC模板实例):
protected List<?> getList(Map<String, ?> param) { String sql = "select birth from member where gender=:gender and surname in (:surname)"; // 若项目中已注入NamedParameterJdbcTemplate实例,直接使用即可 List<?> list = this.namedParameterJdbcTemplate.queryForList(sql, param); return list; }
正确的参数传递方式
调用该方法时,构造参数Map时给surname传入List集合:
Map<String, Object> param = new HashMap<>(); param.put("gender", "male"); // 替换为你的实际gender值 param.put("surname", Arrays.asList("surname1", "surname2")); // 传入List类型的姓氏集合 List<?> result = getList(param);
原理说明
NamedParameterJdbcTemplate会自动处理List类型的参数:
- 将SQL中的
:surname替换为对应数量的占位符(比如2个元素就替换成?,?) - 自动把List中的元素依次绑定到占位符上,最终执行的SQL等价于:
select birth from member where gender=? and surname in (?,?)
而你之前传入字符串的方式,会被当作单个参数值,相当于查询surname = 'surname1','surname2',这不符合IN子句的语法逻辑,因此无法得到正确结果。
内容的提问来源于stack exchange,提问作者JeonYongWook
相关产品推荐
相关产品推荐

