如何通过JDBC动态传参,检索列名以指定字符结尾的SQL列
解决思路与实现方案
方案1:动态构建LIKE匹配字符串
你的参数countryIdLastDigits是Set<Integer>,本身都是数字类型,不存在SQL注入风险,可以直接将集合元素拼接成LIKE需要的字符列表:
- 把集合转成无分隔符的字符串(比如
{1,3,5}转成"135") - 将该字符串拼接到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
相关产品推荐
相关产品推荐

