美文网首页
oracle in语句超过1000数据报错和解决办法

oracle in语句超过1000数据报错和解决办法

作者: Mayuri樂 | 来源:发表于2018-11-21 10:39 被阅读0次

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一般用于数量较小的时候。

相关文章

网友评论

      本文标题:oracle in语句超过1000数据报错和解决办法

      本文链接:https://www.haomeiwen.com/subject/hxuqqqtx.html