在进行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 "''";
}
}
}