oracle有限制in语句的长度,如果查询长度超过1000,就会报jdbc错误:“java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000”。
因为项目用的是spirng jpa封装的持久层代码,数据量少的时候可以直接用in来查询,数据量多的时候就会有这个报错。下面是项目里的解决方案
对传入的数组做分割处理,有两种分隔方法,一种传入结果期望的分组个数,一种是传入期望的每组个数。代码如下:
/**
* 分割数组,以n为个数
* @param source 源数组
* @param n 多少组
* @return
*/
public static <T> List<List<T>> averageAssign(List<T> source,int n){
List<List<T>> result=new ArrayList<List<T>>();
int remaider=source.size()%n; //(先计算出余数)
int number=source.size()/n; //然后是商
int offset=0;//偏移量
for(int i=0;i<n;i++){
List<T> value=null;
if(remaider>0){
value=source.subList(i*number+offset, (i+1)*number+offset+1);
remaider--;
offset++;
}else{
value=source.subList(i*number+offset, (i+1)*number+offset);
}
result.add(value);
}
return result;
}
/**
* 分隔数组,指定每组多少个元素
* @param source 源数组
* @param n 每组几个元素
* @return
*/
public static <T> List<List<T>> averageAssignByPer(List<T> source,int n){
List<List<T>> result=new ArrayList<List<T>>();
int number=source.size()/n; //总共几组
int remain=source.size()%n; //
for(int i=0;i<number+1;i++){
List<T> value=null;
if(i<number){
value=source.subList(i*n, (i+1)*n);
}else{
value=source.subList(i*n, i*n+remain);
}
result.add(value);
}
return result;
}
在处理数据量比较大的需求时谨慎使用in,in一般用于数量较小的时候。
网友评论