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

如何通过JDBC动态传参,检索列名以指定字符结尾的SQL列

解决思路与实现方案

方案1:动态构建LIKE匹配字符串

你的参数countryIdLastDigits是Set<Integer>,本身都是数字类型,不存在SQL注入风险,可以直接将集合元素拼接成LIKE需要的字符列表:

  1. 把集合转成无分隔符的字符串(比如{1,3,5}转成"135")
  2. 将该字符串拼接到SQL的LIKE条件中

修改后的代码示例:

public Map<Long, Set<Long>> groupCountriesBy(Set<Integer> countryIdLastDigits) {
    // 将数字集合转成连续字符串
    String digitsStr = countryIdLastDigits.stream()
                                         .map(String::valueOf)
                                         .collect(Collectors.joining());

    String query = "SELECT c.id FROM countries c"
        + " WHERE c.name LIKE '%[" + digitsStr + "]'"
        + " GROUP BY c.name ";

    // 无需再传入countryIdLastDigits参数,已拼入SQL
    ....
}

方案2:用RIGHT函数+IN子句(更通用安全)

如果想避免SQL字符串拼接,养成参数绑定的好习惯,可以用RIGHT函数取出字段最后一位,再用IN子句匹配动态参数,这种方式不依赖特定数据库的LIKE通配符语法:

修改后的代码示例:

public Map<Long, Set<Long>> groupCountriesBy(Set<Integer> countryIdLastDigits) {
    String query = "SELECT c.id FROM countries c"
        + " WHERE RIGHT(c.name, 1) IN (:countryIdLastDigits)"
        + " GROUP BY c.name ";

    var args = new MapSqlParameterSource("countryIdLastDigits", countryIdLastDigits);

    ....
}

两种方案对比

  • 方案1:贴合你原本的LIKE写法,但仅适用于支持[字符集]通配符的数据库(如SQL Server)
  • 方案2:通用型更强,几乎所有关系型数据库都支持RIGHT/SUBSTRING和IN子句,且全程用参数绑定,更符合JDBC最佳实践

内容的提问来源于stack exchange,提问作者ah_ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:25:47