mybatis foreach in 查询超过1000条解决办法

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);
}
  1. 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('.....')
  • 10
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值