解决oracle,sql语句中in(0,1,2,3......1001)条件数量超过1000时报错的问题

package com.xy.cn;

import java.util.*;

public class ColletionUtil {

    /**
     * 数据分段处理
     * @param collection(list, set , queue...) 待处理数据集合
     * @param perCount 多少条数据为一组
     * @return
     */
    public static Map<Integer, List<?>> doSegment(Collection<?> collection, int perCount){
        if(collection==null || collection.size()==0 || perCount<=0){
            return null;
        }
        int size = collection.size();
        int times = size%perCount==0 ? size/perCount : size/perCount+1;
        Object[] objects = collection.toArray();
        Map<Integer, List<?>> map = new HashMap<>(times);
        int begin,end;
        for (int i = 1; i <=times; i++) {
            List<Object> segmentList = new ArrayList<>(perCount);
            end = i==times ? size : i*perCount;
            System.out.println("("+(i-1)*perCount+","+(end-1)+")");
            for (begin = (i-1)*perCount; begin < end; begin++) {
                segmentList.add(objects[begin]);
            }

            map.put(i, segmentList);
        }
        return map;
    }

    public static void main(String[] args) {
        // 测试案例1
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            list.add("code"+i);
        }
        Map<Integer, List<?>> map = doSegment(list, 9);
        for (Map.Entry<Integer, List<?>> entry : map.entrySet()) {
            System.out.println(entry.getKey() + "," + entry.getValue());
        }
        // 测试案例2
        Set<User> set = new HashSet<>();
        for (int i = 0; i < 30; i++) {
            set.add(new User("name"+i));
        }
        Map<Integer, List<?>> map2 = doSegment(set, 9);
        for (Map.Entry<Integer, List<?>> entry : map2.entrySet()) {
            System.out.println(entry.getKey() + "," + entry.getValue());
        }
    }
}

案例测试结果:

测试案例1
(0,8)
(9,17)
(18,26)
(27,29)
1,[code0, code1, code2, code3, code4, code5, code6, code7, code8]
2,[code9, code10, code11, code12, code13, code14, code15, code16, code17]
3,[code18, code19, code20, code21, code22, code23, code24, code25, code26]
4,[code27, code28, code29]
测试案例2
(0,8)
(9,17)
(18,26)
(27,29)
1,[User{name='name25'}, User{name='name14'}, User{name='name17'}, User{name='name26'}, User{name='name3'}, User{name='name12'}, User{name='name6'}, User{name='name8'}, User{name='name29'}]
2,[User{name='name10'}, User{name='name18'}, User{name='name16'}, User{name='name2'}, User{name='name19'}, User{name='name21'}, User{name='name1'}, User{name='name13'}, User{name='name23'}]
3,[User{name='name0'}, User{name='name11'}, User{name='name24'}, User{name='name5'}, User{name='name15'}, User{name='name4'}, User{name='name28'}, User{name='name20'}, User{name='name7'}]
4,[User{name='name22'}, User{name='name9'}, User{name='name27'}]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值