mybatis in查询条件过长的解决方案

mybatis in查询条件过长的解决

方法1:分次查询,将参数且分割成多个短的查询后合并

代码:

      int splitNum =(int) Math.ceil( (float) ids.length/999); //切片数量
      List itemIdList = new ArrayList<>(Arrays.asList(ids));
      List> splitList = averageAssign(itemIdList, splitNum);
      for (List list : splitList) {
       param.put("itemIds",list);
       List> itemStatisticsList = iProcessExtMapper.getItemStatisticsList(param);
       result.addAll(itemStatisticsList);
      }

将list分成N等分方法方法:

 public static  List> averageAssign(List source,int n){
  List> result=new ArrayList>();
  int remaider=source.size()%n;  //(先计算出余数)
  int number=source.size()/n;  //然后是商
  int offset=0;//偏移量
  for(int i=0;i 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;
 }

方法2:xml文件中编写sql

i.id in     
 
 
   
    ) OR ID IN( 
                 ,
   
 
   #{item}
  

sql逻辑:

ID IN(ids[0],ids[1]+...+ids[998])OR ID IN (ids[999],ids[1000],...ids[max])

mybatis大于1000的in查询的解决

之前公司一位同事写的方法:

但是随着数据量增加,发现大于2000这种方法会报错;

论证如下

mybatis in查询条件过长的解决方案_第1张图片

解决办法


                 NULL ) OR DOC.ID IN (#{item}
            

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

你可能感兴趣的:(mybatis in查询条件过长的解决方案)