美文网首页
mybats逆向工程中使用in数据过长抛出异常问题。

mybats逆向工程中使用in数据过长抛出异常问题。

作者: 漫行者_ | 来源:发表于2018-11-23 18:49 被阅读6次

    当你使用逆向工程一次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。把数据查询出来。然后再一个一个判断。这才是最好的解决办法。不然对数据库造成很大压力

    相关文章

      网友评论

          本文标题:mybats逆向工程中使用in数据过长抛出异常问题。

          本文链接:https://www.haomeiwen.com/subject/kmcsqqtx.html