在项目中遇到了JDBC会抛出“java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000”这个异常。这个异常产生的原因时因为Oracel数据库使用in批量查询时,in后面的参数限制在1000个,如果超过1000个,JDBC会出“java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000”这个异常。初步解决这个问题的思想是把参数列表分段,将SQL语句拼成“or XX in(…) or XX in(…)”形式。
/**
* 按指定大小,分隔集合,将集合按规定的个数分为n个部分
* @param <T>
* @param List<String> list列表
* @param len 长度
* @return
*/
public static <T> List<List<T>> splitList(List<T> list, int len){
if(list == null || list.size() == 0 || len<1) {
return null;
}
List<List<T>> result = new ArrayList<List<T>>();
int size = list.size();
int count = (size + len -1)/len;
for(int i=0; i<count; i++) {
List<T> subList = list.subList(i*len, ((i+1)*len > size ? size : len*(i+1)));
result.add(subList);
}
return result;
}
对应SQL语句如下:
<foreach collection="list" item="item" open="(" close=")" separator="or">
t.dm in
<foreach collection="item" item="item2" index="id"
open="(" close=")" separator=",">
#{item2}
</foreach>
</foreach>
————————————————
版权声明:本文为CSDN博主「orangeverity」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/orangeverity/article/details/86554912