ibatis/mybatis出現 sql 語句 where in(引數1,引數2……引數1000) 超過1000個引數時候的解決方案
阿新 • • 發佈:2018-12-17
公司專案出現bug,查詢後是由於sql 語句in()內參數查過1000引起的
由於專案比較大,無法輕易修改或重構。
公司框架比較老用了ibates 無法從xml配置裡進行修改。所以本人寫了段程式碼,當list資料量超過1000的時候呼叫另一套sql,傳入一個字串代替原本的sql
原本的sql
補丁sql
程式碼
List<String> partnerIds=ExtConfigUtil.getPartnerId(); if(!"-1".equals(partnerIds)||!"0".equals(partnerIds)){ param.put("partanerIds", partnerIds); } //原始碼 //partnerList= daoHelper.queryForList("epm.extconfig.getPartners", param); //修改後程式碼 if(partnerIds.size()<999) { partnerList= daoHelper.queryForList("epm.extconfig.getPartners", param); }else { param.put("partanerIds", createSql("t.id", partnerIds)); partnerList= daoHelper.queryForList("epm.extconfig.getPartnersbuding", param); } /** * 緊急補救資料量超過1000時 sql in(v1,v2……,v1001)產生的錯誤 * 傳入引數 (欄位 , 包含的) */ public String createSql(String col ,List partners) { StringBuffer sb = new StringBuffer(); sb.append(col+" in("); int size = partners.size(); //合作伙伴個數 int index = 0; for(int i = 0;i<partners.size();i++) { index++; if(index==999) { index =0; sb.append(")"); sb.append(" or " + col + " in ( "); } if(index+1 ==999||partners.size()-1==i) { sb.append("'"+partners.get(i)+"'"); }else { sb.append("'"+partners.get(i)+"',"); } } sb.append(")"); return sb.toString(); }