sql查询in条件超过1000条解决方案

一. 背景:

小熙最近做的数据检索比较大,其中会使用到,in的条件会有超过1000条。但是in所支持的条件数量最多只有1000,那怎么办呢,后来小熙采取了分区检索,完成了。

二. 引入依赖:

  1. 引入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>
    

三. 实现代码:

  1. 使用apache工具类,将条件集合分区(下面第二个参数500,是每个分区的最大个数)

    List<List<String>> partitionList = ListUtils.partition(Lists.newArrayList("被分区的条件集合"), 500);
    
  2. 查询
    可以使用多次查询也可以分线程查找等,这里小熙由于需求需要,所以要一起判断,
    使用了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>
    

四. 结言:

解决方案有很多,其中的处理手段也有非常多。具体可以根据业务场景和系统抉择下,这里小熙只是提供一个想法思路。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值