Mybatis Plus 分页插件报错`GOLDILOCKS`
1. 背景
接手了一个开发中的项目,技术栈如下:
- 数据库: TimeScaleDB(基于PostgreSQL,现已改名TigerData)
- ORM: Mybatis Plus
- 分页插件: Mybatis Plus自带的分页插件
2. 问题
- 分页插件的数据库类型DbType设置为DbType.POSTGRE_SQL时,分页查询报错:
Handler dispatch failed; nested exception is java.lang.NoSuchFieldError: GOLDILOCKS
- 分页插件的数据库类型DbType设置为DbType.MYSQL时,分页查询报错:
ERROR: LIMIT #,# syntax is not supported
(MySQL支持, PostgreSQL语法为limit xx offset xx
)
3. 心路历程
- 一开始我看分页插件配置如下(官方文档默认的):
@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}
- 我心想,我们数据库又不是MySQL,为什么用这个?遂改之:
@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}
然后分页查询时直接报错Handler dispatch failed; nested exception is java.lang.NoSuchFieldError: GOLDILOCKS
,瞬间心慌慌的,查了好久也没找到解决方法.
当时赶进度,催得紧,又赶紧改回去了.
3. 然后这段时间的开发也正常,也没出问题(奇怪?可能之前一直都是第一页?).直到刚才,分页查询时突然报错:
Error querying database. Cause: org.postgresql.util.PSQLException: ERROR: LIMIT #,# syntax is not supported建议:Use separate LIMIT and OFFSET clauses.
发现生成的SQL为LIMIT xxx,xxx
,此语法MySQL支持,PostgreSQL不支持,只支持LIMIT xxx OFFSET xxx
.
没办法,只有又改回DbType.POSTGRE_SQL
,但此时问题就出来了,Handler dispatch failed; nested exception is java.lang.NoSuchFieldError: GOLDILOCKS
这个报错全网和官方仓库的issue列表都没查到解决方法(甚至该问题都没查到).
此时只能静下心来自己解决了,查看异常堆栈:
Caused by: java.lang.NoSuchFieldError: GOLDILOCKSat com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory.getDialect(DialectFactory.java:41)at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.findIDialect(PaginationInnerInterceptor.java:198)at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.beforeQuery(PaginationInnerInterceptor.java:174)at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:78)
- 看上面应该是缺少数据库方言Dialect,然后回过去看文档,发现
PaginationInnerInterceptor
还有个属性是dialect
用来指定方言实现类.看到这,心里就知道怎么解决了,配置处改成如下:
@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();PaginationInnerInterceptor innerInterceptor = new PaginationInnerInterceptor(DbType.POSTGRE_SQL);innerInterceptor.setDialect(new PostgreDialect()); // 指定数据库方言interceptor.addInnerInterceptor(innerInterceptor);return interceptor;}
- 怀着忐忑的心情重新运行,正常.
Perfect!!!
3. 感言
回顾了下查找解决方法的历程,苦于没有直接找到解决方法,故写下此文章以供相同问题的开发者参考.