gpt4 book ai didi

java - 准备语句 setString 添加不必要的单引号到字符串

转载 作者:行者123 更新时间:2023-12-02 04:19:13 26 4
gpt4 key购买 nike

背景

我正在尝试将 ArrayList 的内容设置到 Db2 SQL 语句中的 IN 子句中。我正在使用 PreparedStatement 来构建我的查询。 这是我们的编码标准。

我尝试过的#1

我研究了几种方法来实现这一目标。我首先尝试使用 setArray() 如这个问题所示:How to use an arraylist as a prepared statement parameter结果是我收到错误 Err com.ibm.db2.jcc.am.SqlFeatureNotSupportedException: [jcc][t4][10344][11773][3.65.110] Data type ARRAY is not support on the目标服务器。 ERRORCODE=-4450, SQLSTATE=0A502 在这个障碍之后,我转向#2

我尝试过的#2

然后,我尝试使用 Apache Commons StringUtils 将 ArrayList 转换为逗号分隔的字符串,就像我的 IN 子句所需的那样。结果是,这正是我所需要的,我有一个字符串,所有结果都用逗号分隔。

问题:

setString() 方法在字符串的开头和结尾添加单引号。我已经用过很多次了,但从来没有这样做过。 有谁知道是否有解决这个问题的方法,或者使用PreparedStatement的替代方法?如果我使用字符串连接,我的查询就可以工作。

代码(如上所述):

    List<String> selectedStatuses = new ArrayList<String>(); //Used to store contents of scoped var

//Get Contents of Checkbox which are in the form of a List
selectedStatuses = (List) viewScope.get("selectedStatuses");

String selectedStatusesString = StringUtils.join(selectedStatuses, ",");

.... WHERE ATM_DET_ATM_STAT IN (?)";
ps.setString(1, selectedStatusesString);

日志值显示字符串的正确值

调试:selectedStatusesString:'OPEN'、'CLOSED'、'WOUNDED'、'IN PROGRESS'

错误结果的视觉效果

enter image description here

开头和结尾的引号是问题所在。

最佳答案

要使 IN 子句发挥作用,您需要与值一样多的标记:

String sql = "SELECT * FROM MyTable WHERE Stat IN (?,?,?,?)";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, "OPEN");
stmt.setString(2, "CLOSED");
stmt.setString(3, "WOUNDED");
stmt.setString(4, "IN PROGRESS");
try (ResultSet rs = stmt.executeQuery()) {
// use rs here
}
}

由于您有一个动态值列表,因此您需要执行以下操作:

List<String> stats = Arrays.asList("OPEN", "CLOSED", "WOUNDED", "IN PROGRESS");

String markers = StringUtils.repeat(",?", stats.size()).substring(1);
String sql = "SELECT * FROM MyTable WHERE Stat IN (" + markers + ")";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
for (int i = 0; i < stats.size(); i++)
stmt.setString(i + 1, stats.get(i));
try (ResultSet rs = stmt.executeQuery()) {
// use rs here
}
}

从 Java 11 开始,不再需要 StringUtils:

String markers = ",?".repeat(stats.size()).substring(1);

关于java - 准备语句 setString 添加不必要的单引号到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32976923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com