mybatis foreach in 查询超过1000条解决办法
mybaits 中的foreach in的查询时候,上限in的个数是1000个,如超过1000怎么办呢?
下面介绍两种办法,一是从java代码层面,分批查询,1000个是一批,循环查。最终把结果统计在一起。
而是 从sql层面分组查,1000个查一次,利用mybatis的if标签来手动拼接一段sql解决问题。
1.java层面
// 1. 装有最终查询总数据条数的集合
List<xxxxDTO> allMxDTOList = new ArrayList<>();
// 2. 将参数分组 1000个放入一个集合,小于1000大容器中只有一个小list。切分了多少组就有多少个小list。
// jylsIdList是将要切割的参数
List<List<String>> paramListListPartition = com.google.common.collect.Lists.partition(paramList, 1000);
// 3. 切割出的参数大集合循环查库
for( List<String> idsList : paramListListPartition){
pageParamMap.put("idList",idsList);
List<xxxxDTO> resultDTOListTemp = xxxxServiceImpl.selectXxxxInfoByListID(pageParamMap);
if(org.apache.commons.collections.CollectionUtils.isEmpty(resultDTOListTemp)){
continue;
}
// 没查出一次结果就保存一次到最终查询总条数的集合中
allMxDTOList .addAll(resultDTOListTemp);
}
-
sql层面
SELECT * FROM ${tabNameMx} M WHERE M.CODE_ID IN <foreach collection="idList" index="index" open="(" close=")" item="id" separator=","> <if test="(index % 999) == 998"> NULL) OR M.CODE_ID IN(</if>#{id} </foreach>
sql层面可能有些人看了懵逼,现在给你写段这段sql最终会变成什么样子,这样你瞬间就懂了。
sql最终执行的样子:
CODE_ID IN('......','998',NULL ) OR OR M.CODE_ID IN('999',..... NULL) OR M.CODE_ID IN('.....')