当你使用逆向工程一次in的list过长。超过一千,就会抛出异常。
超级坑,发现异常之后让我修复。关键都是用逆向工程生成的代码。逻辑很不清楚。
解决办法1:
比如:in (x1,x2....x2000) 改写成 in (x1,x2...x1000) or in (x1001..x2000)
可是在mybatis逆向工程想写成这样就需要改Example文件,以及xml文件。
*修改Example:
先添加以下方法。将一个大list分成几个小份
private List<List> getSplitList(List values) {
if (values == null || values.size() == 0) return null;
List<List> result = Lists.newArrayList();
if (null != values && values.size() > 0) {
int pointsDataLimit = 500;//限制条数
Integer size = values.size();
//判断是否有必要分批
if (pointsDataLimit < size) {
int part = size / pointsDataLimit;//分批数
for (int i = 0; i < part; i++) {
//500条
List<String> listPage = values.subList(0, pointsDataLimit);
result.add(new ArrayList<String>(listPage));
//剔除
listPage.clear();
}
if (!values.isEmpty()) {
result.add(values);
}
} else {
result.add(values);
}
}
return result;
}
将每个涉及到以List为形参的修改。比如
public Criteria andIdIn(List<String> values) {
List<List> result = getSplitList(values);
addCriterion("wforder.id in", result, "id");
return (Criteria) this;
}
*修改xml文件
<when test="criterion.listValue" >
and (
<!--<foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">-->
<!--#{listItem}-->
<!--</foreach>-->
<foreach collection="criterion.value" item="list" separator="OR">
${criterion.condition}
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</foreach>
)
</when>
注意:改了之后逆向工程的notin不可能使用。
解决方法二
对于数据量太多。可以先不用in。把数据查询出来。然后再一个一个判断。这才是最好的解决办法。不然对数据库造成很大压力
网友评论