mybatis-plus分页插件(PaginationInnerInterceptor)报错的问题

12 篇文章 0 订阅
6 篇文章 0 订阅

问题

mybatis-plus使用 PaginationInnerInterceptor 分页插件,在调用分页查询方法时(****Service.page(new Page(param.getPage(),param.getPageSize()),queryWrapper) )报如下错误

 2022-07-22 17:07:20.699 [TID: N/A]  WARN 12444 --- [io-18080-exec-1] c.b.m.e.p.i.PaginationInnerInterceptor   : optimize this sql to a count sql has exception, sql:"sql语句略", exception:
net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "," ","
    at line 1, column 191.

Was expecting one of:

    "&"
    "::"
    ";"
    "<<"
    ">>"
    "ACTION"
    "ACTIVE"
    "ALGORITHM"
    "ARCHIVE"
    "ARRAY" 
    ***略****

原因

分页插件在处理count时会默认进行sql优化,优化失败会抛出异常。无法优化的sql会降级到非优化的count方法。
代码摘要如下:
其中 Select select = (Select) CCJSqlParserUtil.parse(sql);这行代码报错了

    protected String autoCountSql(IPage<?> page, String sql) {
        if (!page.optimizeCountSql()) {
            return lowLevelCountSql(sql);
        }
        try {
            Select select = (Select) CCJSqlParserUtil.parse(sql);
            **************优化逻辑略*********************
            return select.toString();
        } catch (JSQLParserException e) {
            // 无法优化使用原 SQL
            logger.warn("optimize this sql to a count sql has exception, sql:\"" + sql + "\", exception:\n" + e.getCause());
        } catch (Exception e) {
            logger.warn("optimize this sql to a count sql has error, sql:\"" + sql + "\", exception:\n" + e);
        }
        return lowLevelCountSql(sql);
    }

解决办法

解决思路:既然优化报错,那就别优化了。
上边代码方法开头有如下判断:
if (!page.optimizeCountSql()) {
return lowLevelCountSql(sql);
}
只要把 optimizeCountSql 设置为false就可以了,如下

Page page = new Page(param.getPage(),param.getPageSize()),queryWrapper)
page.setOptimizeCountSql(false);

也可以重新定义一个类继承Page,设置optimizeCountSql 默认=false

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值