公司项目出现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();
}