准备好的语句setString向字符串

时间:2015-10-06 18:20:25

标签: java db2 prepared-statement

背景

我正在尝试将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 supported on the target server. ERRORCODE=-4450, SQLSTATE=0A502在此障碍之后,我转到#2

我尝试了什么#2

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

问题:

setString()方法是在String的开头和结尾添加单引号。我已经多次使用它,它从未这样做过。 有没有人知道是否有解决方法,或使用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);

显示String

的正确值的日志值

DEBUG:selectedStatusesString:'OPEN','CLOSED','WOUNDED','IN PROGRESS'

视觉结果不正确

enter image description here

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

2 个答案:

答案 0 :(得分:1)

要使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
    }
}

答案 1 :(得分:0)

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