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一般用于數量較小的時候。