db2 准备 好 的 语句 setString 向 String 添加 了 不 必要 的 单 引号

wnrlj8wa  于 2022-11-07  发布在  DB2
关注(0)|答案(3)|浏览(172)

背景

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

我尝试过的第一次

我研究了几种方法来实现这一点。我第一次尝试使用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 supported on the target server. ERRORCODE=-4450, SQLSTATE=0A502在这个障碍之后,我转到了#2
"我尝试过的第二种方法“
然后我尝试使用Apache Commons StringUtils将ArrayList转换为逗号分隔的String,就像我的IN子句所需要的那样。结果是,这完全完成了我所需要的,我得到了一个String,所有结果都用逗号分隔。

问题:

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);

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

调试:选定状态字符串:'OPEN','CLOSED','WOUNDED','IN PROGRESS'

目视检查不正确结果

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

62lalag4

62lalag41#

要使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);
snvhrwxg

snvhrwxg2#

使用两个撇号''来得到DB2上的单个撇号,根据DB2 Survival Guide .然后调用.setString()。

roejwanj

roejwanj3#

对于其他遇到单引号问题的人来说,我必须修改我的函数,使其不使用?来设置值;相反,我只是将整个查询视为一个字符串:

public static void runQuery(String tableName, String columnName, int value, String whereName, String whereValue) {
        try (Connection con = DatabaseConnection.getConnection()) {
            try (PreparedStatement ps = con.prepareStatement("UPDATE " + tableName + " SET " + columnName + " = " + value + " WHERE " + whereName + " = " + "'" + whereValue + "'")) {
                ps.executeUpdate();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

希望这对你有帮助

相关问题