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;
 }

posted on 2016-07-29 10:19  党建顺  阅读(2683)  评论(0编辑  收藏  举报