sql 条件in() 中值过多拆分
/**
* 拆分sql中in值超过1000个的sql 由于oracle现在表达式个数不能超过1000个,所以需要拆分
*
* @param sql
* @param paramMap
* @return
* @throws Exception
*/
protected String splitInSql(String sql, Map<String, Object> paramMap)
throws Exception {
String oldSql = sql;
try {
Pattern p = Pattern.compile(
"\\s*(\\w*\\.*\\w+)\\s*in\\s*\\(\\s*\\:(\\w+)\\s*\\)",
Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(sql);
StringBuffer newSql = new StringBuffer();
while (m.find()) {
String group = m.group();
String fieldVal = m.group(2);
StringBuffer innerSql = new StringBuffer();
if(paramMap.get(fieldVal) instanceof Collection){
Collection<?> dataCollection = (Collection<?>) paramMap
.get(fieldVal);
if (null != dataCollection && (dataCollection instanceof List || dataCollection instanceof Set)
&& dataCollection.size() > SQL_IN_NUM) {
List<?> dataList;
if(dataCollection instanceof Set){
dataList = (List<?>) new ArrayList(dataCollection);
}else{
dataList = (List<?>) dataCollection;
}
int num = dataList.size() / SQL_IN_NUM;
if (dataList.size() % SQL_IN_NUM > 0) {
num++;
}
innerSql.append("(");
for (int i = 1; i <= num; i++) {
int begin = (i - 1) * SQL_IN_NUM;
int end = ((i * SQL_IN_NUM) > dataList.size()) ? dataList
.size() : (i * SQL_IN_NUM);
paramMap.put(fieldVal + "_" + i,
dataList.subList(begin, end));
if (i != 1) {
innerSql.append(" or ");
}
innerSql.append(group.replace(":"+fieldVal, ":"+fieldVal+ "_" + i));
}
innerSql.append(")");
m.appendReplacement(newSql, innerSql.toString());
}
}
}
m.appendTail(newSql);
sql = newSql.toString();
} catch (Exception e) {
LogUtil.error(this.getClass(), e);
sql = oldSql;
}
return sql;
}