背景
我正在尝试将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'
视觉结果不正确
开头和结尾的引号都是问题。
答案 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()。