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

Kotlin中如何将列表作为SQL查询的参数?

问题描述

我有一个列表:

("item 1" , "item 2")

使用的SQL查询语句为:

SELECT * FROM table
WHERE SYSTEM in (?)

我当前通过以下方式传递参数:

pstmt.setString(1,list)

我尝试过将列表内的值格式化为('item1' , 'item')的形式以适配SQL查询,但始终无效。因为传递参数时整个字符串会被加上引号,逗号也包含在引号内,导致查询异常。请问是否有可行的方法将列表作为SQL查询的参数?

可行解决方案
  • 动态生成参数占位符(推荐)
    根据列表的长度,在SQL里生成对应数量的?占位符,比如列表有2个元素,SQL就变成WHERE SYSTEM in (?, ?),再循环给每个占位符赋值:

    // 生成对应数量的?占位符
    String placeholders = String.join(", ", Collections.nCopies(list.size(), "?"));
    String sql = "SELECT * FROM table WHERE SYSTEM in (" + placeholders + ")";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    // 循环设置参数
    for (int i = 0; i < list.size(); i++) {
        pstmt.setString(i + 1, list.get(i));
    }
    

    这种方式完全遵循预编译SQL的规范,能避免SQL注入,兼容性也最好。

  • 利用数据库的数组参数支持(部分数据库可用)
    如果你的数据库(比如PostgreSQL、Oracle)支持数组类型,可以直接传递数组参数,SQL语法需要对应调整:

    String[] arr = list.toArray(new String[0]);
    // 创建SQL数组
    Array sqlArray = conn.createArrayOf("VARCHAR", arr);
    pstmt.setArray(1, sqlArray);
    

    对应的SQL要改成:

    -- PostgreSQL 示例
    SELECT * FROM table WHERE SYSTEM = ANY(?)
    
  • 避坑提醒
    绝对不要手动拼接带引号的字符串到SQL里(比如直接写WHERE SYSTEM in ('item1','item2')),这种做法不仅会引发SQL注入风险,当列表元素包含单引号时还会直接导致SQL语法错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:01:05