美文网首页
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