分页插件冲突问题

分页插件的实现有两种实现一个是引用pageHelper,一般是配合mybatis使用的。需要引入下面的依赖。

java 复制代码
       <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.1.6</version>
        </dependency>

上面的分页插件版本依赖jsqlparser 0.9.5。然后在 mybatis-config.xml 中配置插件。

java 复制代码
<configuration>
    <!-- 其他配置... -->
    
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 设置数据库方言(根据你的数据库选择,如 mysql, oracle 等) -->
            <property name="helperDialect" value="mysql"/>
            <!-- 分页合理化参数 -->
            <property name="reasonable" value="true"/>
        </plugin>
    </plugins>
</configuration>

代码使用示例:

java 复制代码
  PageHelper.startPage(info.getCurrentPage(), info.getPageSize());
        List<CaseLog> list = caseLogService.getCaseLogList(info);
        PageInfo<CaseLog> pageInfo = new PageInfo<>(list);
        return ResponseEntity.ok(pageInfo);

第二种使用方式:使用mybatsi-plus的分页插件

java 复制代码
 <!-- MyBatis-Plus 插件配置 -->
        <property name="plugins">                                                                                                                                                                                                   
            <list>                                                                                                                                                                                                                  
                <bean class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor">                                                                                                                                    
                    <property name="interceptors">                                                                                                                                                                                  
                        <list>                                                                                                                                                                                                      
                            <!-- 分页插件:仅 evidenceSqlSessionFactory 启用,旧代码使用 PageHelper -->                                                                                                                             
                            <bean class="com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor">                                                                                                              
                                <property name="dbType" value="MYSQL"/>                                                                                                                                                             
                                <property name="overflow" value="false"/>                                                                                                                                                           
                                <property name="maxLimit" value="500"/>                                                                                                                                                             
                            </bean>                                                                                                                                                                                                 
                                                                                                                                                                                                                                    
                                                                                                                           
                        </list>                                                                                                                                                                                                     
                    </property>                                                                                                                                                                                                     
                </bean>                                                                                                                                                                                                             
            </list>                                                                                                                                                                                                                 
            

该配置需要jsqlparser 4.0版本及以上。

代码使用示例:

java 复制代码
 LambdaQueryWrapper<IssExportTask> queryWrapper = new QueryWrapper<IssExportTask>().lambda();
        queryWrapper.select(IssExportTask::getId, IssExportTask::getOperatorNo, IssExportTask::getCreateTime, IssExportTask::getReadOrNot,
                IssExportTask::getStatus, IssExportTask::getFileName, IssExportTask::getErrorMsg, IssExportTask::getModule, IssExportTask::getUpdateTime,
                IssExportTask::getOperatorName, IssExportTask::getType, IssExportTask::getFileUrl,IssExportTask::getExpirationTime);
        queryWrapper.eq(IssExportTask::getOperatorNo, empNo);
        queryWrapper.orderByDesc(IssExportTask::getCreateTime);
        Page<IssExportTask> page = new Page<>(request.getPageNumber(), request.getPageSize());
        Page<IssExportTask> issExportTaskPage = issExportTaskMapper.selectPage(page, queryWrapper);
        List<IssExportTask> records = issExportTaskPage.getRecords();

现在代码报错如下:

java 复制代码
Caused by: java.lang.NoSuchMethodError: net.sf.jsqlparser.statement.select.PlainSelect.getGroupByColumnReferences()Ljava/util/List;   

这是由于我强制使用了jsqlparser 4.0版本导致的。

java 复制代码
        <dependency>
            <groupId>com.github.jsqlparser</groupId>
            <artifactId>jsqlparser</artifactId>
            <version>4.0</version>
        </dependency>

这就是问题的冲突点,4.0的版本已经没有getGroupByColumnReferences()方法了。我的项目中使用了两套分页配置,一个是mybatis3.5.10,使用pageHelper进行分页。另一个配置是mybatis-plus的3.4.1,使用配置的MybatisPlusIntercepto进行分页,但是两者依赖的jsqlparser版本不一致,我升级或者降级都必然导致一个分页插件不能使用。最后我还是选择了降级jsqlparser版本,mybatis-plus的分页也可以使用pageHelper其它或原始的方式实现。

除了上面的解决办法其实还有另一种方案,还是使用4.0的版本,但是关闭PageHelper的SQL解析器(SqlParser),这样影响也不是很大。

PageHelper 的 SQL 解析(依赖 jsqlparser)主要用于"智能分页"(自动将 SQL 改写为 count 查询)。

如果不开启 sqlParser 功能,PageHelper 不会调用getGroupByColumnReferences(),从而避开这个 NoSuchMethodError。

配置方式:在 sqlSessionFactory 的 plugins 中添加 PageInterceptor,并在 PageHelper 配置中设置 sqlParser 为 null 或关闭。

影响:复杂 SQL(如包含 GROUP BY)的分页可能统计不准(total = 实际返回条数而非总记录数),但绝大多数简单查询不受影响。 复杂 SQL(如有 GROUP BY / UNION):才会得到不准确的 total。

相关推荐
无聊的老谢2 分钟前
Vue 3 + Leaflet 实现高性能 Web GIS 基站监控平台
前端·javascript·vue.js
之歆3 分钟前
Day23_Bootstrap 前端框架完全指南:从栅格系统到组件化开发
开发语言·前端·javascript·前端框架·bootstrap·ecmascript·less
前端 贾公子4 分钟前
3.响应式系统基础:从发布订阅模式的角度理解 Vue2 的数据响应式原理(上)
前端·javascript·vue.js
2501_940041747 分钟前
纯前端高阶实战:涵盖3D、音频可视化与复杂交互的开发命题
前端
AIFQuant7 分钟前
外汇交易平台技术栈深度解析:行情 API、清算、风控、前端一体化方案
前端·python·websocket·金融·restful
NiceCloud喜云8 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
为思念酝酿的痛8 小时前
POSIX信号量
linux·运维·服务器·后端
Dfreedom.9 小时前
Windows、虚拟机、开发板组网通信原理及调试通联步骤
人工智能·windows·部署·边缘计算·开发板·模型加速
wordbaby9 小时前
React Native + RNOH:跨页面数据回传的最佳实践与避坑指南
前端·react native
丷丩9 小时前
MapLibre GL JS第22课:查看本地GeoJSON
前端·javascript·map·mapbox·maplibre gl js