前两天客户在使用系统的单据打印功能的时候发现的:由于单据信息的查询是通过in(单据ID,单据ID,单据ID…)查询的。当用户选择的单据数超过1000条,即前端传给后台的ID数超过1000条就会出现问题。上网查询解决方法,了解到可以将条件分段,in后面拼接or in()来解决。因此写了个小算法来记录一下,将(单据ID,单据ID,单据ID…)分割成最多1000条的小段。
public List<String> subBillIds(String billIds){
//count计算每段中的,个数
int count = 0;
//startIndex记录从字符串哪里开始截取的位置
int startIndex = 0;
//segment记录一共有几段
int segment = 1;
List<String> billIdList = new ArrayList<>();
if(!billIds.contains(",")){
billIdList.add(billIds);
return billIdList;
}else {
for (int i = 0;i<billIds.length();i++){
if (',' == billIds.charAt(i)){
count++;
//如果所有的单据条数小于等于1000条则不用分段
if (i == billIds.lastIndexOf(',') && count<1000 && segment ==1){
billIdList.add(billIds);
//每满1000个id,就会有999个逗号
}else if (count == 1000){
String segmentStr = billIds.substring(startIndex, i);
billIdList.add(segmentStr);
startIndex = i+1;
count = 0;
segment++;
//如果最后一段的单据数小于1000条直接把剩下所有字符归为一段
}else if (i == billIds.lastIndexOf(',') && count<1000 && segment >1){
String segmentStr = billIds.substring(startIndex);
billIdList.add(segmentStr);
}
}
}
return billIdList;
}
}
sql查询拼接:
if(billNoList.size() == 1){
sql += " and t.bill_no in ("+billNoList.get(0)+")";
}else {
sql += " and (t.bill_no in ("+billNoList.get(0)+")";
for (int i = 1;i<billNoList.size();i++){
sql += " or t.bill_no in ("+billNoList.get(i)+")";
}
sql += ")";
}
搞定,虽然说这样拼接查询效率低了点,但至少解决了。。。