背景
我正在尝试将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'
目视检查不正确结果
开头和结尾的引号才是问题所在。
3条答案
按热度按时间62lalag41#
要使
IN
子句起作用,需要与值一样多的标记:由于您有一个动态值列表,因此需要执行以下操作:
从Java 11开始,不再需要
StringUtils
:snvhrwxg2#
使用两个撇号
''
来得到DB2上的单个撇号,根据DB2 Survival Guide .然后调用.setString()。roejwanj3#
对于其他遇到单引号问题的人来说,我必须修改我的函数,使其不使用?来设置值;相反,我只是将整个查询视为一个字符串:
希望这对你有帮助