天天看点

SQL使用IN超过1000个条件的处理

在进行SQL查询的时候,如果使用了IN进行条件筛选的时候,由于IN的筛选有长度限制,不能超过1000条,所以需要对条件进行分割,以下方法可对条件进行分割。

当list.size()=n(n>1) 则返回
 'list1','list2',...,'list900') or parameter in ('list901','list902',...,'list1800') or parameter in ('list1801','list1802',...,'listn'
当 list.size()=0  则返回 ''      

例如:需要执行select * from tableA a where a.id in (‘1’,‘2’,‘3’);则正常的SQL定义为select * from tableA a where a.id in ($ids$)

       令:List  list = new ArrayList();

               list.add('1');

               list.add('4');

               list.add('3');

      调用方式是:getInParameter(list,"a.id");

       假设次数阈值为2,这该方法的返回值为  ‘1’,‘2’) or a.id in ('3' 

       因此SQL应该定义成:select * from tableA a where (a.id in ($ids$))

import org.apache.commons.lang.StringUtils;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * Created by jinga on 2016/8/2.
 */
public class JdbcSqlUtil {

    /**
     * 根据传入的List和参数,拼接in条件,防止in超过999条
     *
     * @param list
     * @param parameter
     * @return list.size()=n  'list1','list2',...,'list900') or parameter in ('list901','list902',...,'list1800') or parameter in ('list1801','list1802',...,'listn'
     * list.size()=0  ''
     */
    public static String getInParameter(List list, String parameter) {
        if (!list.isEmpty()) {
            List<String> setList = new ArrayList<String>(0);
            Set set = new HashSet();
            StringBuffer stringBuffer = new StringBuffer();
            for (int i = 1; i <= list.size(); i++) {
                set.add("'" + list.get(i - 1) + "'");
                if (i % 900 == 0) {//900为阈值
                    setList.add(StringUtils.join(set.iterator(), ","));
                    set.clear();
                }
            }
            if (!set.isEmpty()) {
                setList.add(StringUtils.join(set.iterator(), ","));
            }
            stringBuffer.append(setList.get(0));
            for (int j = 1; j < setList.size(); j++) {
                stringBuffer.append(") or " + parameter + " in (");
                stringBuffer.append(setList.get(j));
            }
            return stringBuffer.toString();
        } else {
            return "''";
        }

    }

}