一. 背景:
小熙最近做的数据检索比较大,其中会使用到,in的条件会有超过1000条。但是in所支持的条件数量最多只有1000,那怎么办呢,后来小熙采取了分区检索,完成了。
二. 引入依赖:
- 引入apache的工具类坐标,下面会引用其中的集合分区api
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.3</version> </dependency>
三. 实现代码:
-
使用apache工具类,将条件集合分区(下面第二个参数500,是每个分区的最大个数)
List<List<String>> partitionList = ListUtils.partition(Lists.newArrayList("被分区的条件集合"), 500);
-
查询
可以使用多次查询也可以分线程查找等,这里小熙由于需求需要,所以要一起判断,
使用了xml中的双重for循环组成了多个in的or连接:<if test="searchDTO.user != null"> <if test="searchDTO.user.supplierDTO != null"> <if test="searchDTO.user.supplierDTO.partitionList != null and searchDTO.user.supplierDTO.partitionList.size != 0"> and <foreach collection="searchDTO.user.supplierDTO.partitionList" index="indexList" item="partitionSet" open="(" separator=" " close=")"> <if test="partitionSet != null and partitionSet.size != 0"> <if test="indexList != 0"> or </if> numbering in <foreach collection="partitionSet" index="indexSet" item="partitionNumber" open="(" separator="," close=")"> #{partitionNumber} </foreach> </if> </foreach> </if> </if> </if>
四. 结言:
解决方案有很多,其中的处理手段也有非常多。具体可以根据业务场景和系统抉择下,这里小熙只是提供一个想法思路。