看ORA-01795中给出的内容是SQL语句的 expressions 中list接受的最大值是1000,查了下ORA-01795的说明,确定问题出在IN后括号里的主键值超过1000上。
解决方案:这段代码只要测试所以当超过2个就拼接
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<String>();
list.add("机构1");
list.add("机构2");
list.add("机构3");
list.add("机构4");
list.add("机构5");
list.add("机构6");
list.add("机构7");
list.add("机构8");
list.add("机构9");
System.out.println(getString(list));
}
private static String getString(List<String> list){
StringBuffer sb = new StringBuffer();
int inNum = 1; //已拼装IN条件数量
for(int i=0; i<list.size(); i++) {
if(StringUtil.isEmpty(custNOs[i])) continue;
//这里不要犯低级错误而写成:if(i == custNOs.length)
if(i == (list.size()-1))
sb.append("'" + list.get(i) + "'"); //SQL拼装,最后一条不加“,”。
else if(inNum==2 && i>0) {
sb.append("'" + list.get(i) + "' ) OR CUST_NO IN ( "); //解决ORA-01795问题
inNum = 1;
}
else {
sb.append("'" + list.get(i) + "', ");
inNum++;
}
}
return sb.toString();
}
实际用的时候代码:
StringBuffer sb = new StringBuffer();
int inNum = 1; //已拼装IN条件数量
for(int i=0; i<list.size(); i++) {
if(StringUtil.isEmpty(custNOs[i])) continue;
//这里不要犯低级错误而写成:if(i == custNOs.length)
if(i == (list.size()-1))
sb.append("'" + list.get(i) + "'"); //SQL拼装,最后一条不加“,”。
else if(inNum==1000 && i>0) { //这里数据最大支持1000行,所以这里当超过1000的时候就拼接
sb.append("'" + list.get(i) + "' ) OR CUST_NO IN ( "); //解决ORA-01795问题
inNum = 1;
}
else {
sb.append("'" + list.get(i) + "', ");
inNum++;
}
}
return sb.toString();
返回结果:
实际主要代码:
mybatis的部分写法:
数据库字段名 in ( ${ 传入的值sb.toString() } )