You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:36:14