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

网友投稿 1365 2022-12-02

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

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

目录mybatis in查询条件过长的解决方法1:分次查询,将参数且分割成多个短的查询后合并方法2:xml文件中编写sqlmybatis大于1000的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

List> result=new ArrayList>();

int remaider=source.size()%n; //(先计算出余数)

int number=source.size()/n; //然后是商

int offset=0;//偏移量

for(int i=0;i

List value=null;

if(remaider>0){

value=source.subList(i*number+offset, (i+1)*number+offset+1);

remaider--;

offset++;

}else{

value=souhttp://rce.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查询的解决

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

SELECT

FROM KM_DIR_DOC_LINK T

WHERE T.DIR_ID IN

<foreach collection="array" index="index" open="(" close=")" item="item" separator=",">

NULL) OR T.DIR_ID IN (#{item}

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

论证如下

解决办法

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

List> result=new ArrayList>();

int remaider=source.size()%n; //(先计算出余数)

int number=source.size()/n; //然后是商

int offset=0;//偏移量

for(int i=0;i

List value=null;

if(remaider>0){

value=source.subList(i*number+offset, (i+1)*number+offset+1);

remaider--;

offset++;

}else{

value=souhttp://rce.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查询的解决

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

SELECT

FROM KM_DIR_DOC_LINK T

WHERE T.DIR_ID IN

<foreach collection="array" index="index" open="(" close=")" item="item" separator=",">

NULL) OR T.DIR_ID IN (#{item}

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

论证如下

解决办法

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

List value=null;

if(remaider>0){

value=source.subList(i*number+offset, (i+1)*number+offset+1);

remaider--;

offset++;

}else{

value=souhttp://rce.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查询的解决

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

SELECT

FROM KM_DIR_DOC_LINK T

WHERE T.DIR_ID IN

<foreach collection="array" index="index" open="(" close=")" item="item" separator=",">

NULL) OR T.DIR_ID IN (#{item}

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

论证如下

解决办法

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:css hack for IE
下一篇:数据库共享锁(读锁)和排他锁(写锁)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~