当前位置: 首页 > news >正文

Mybatis Plus 分页插件报错`GOLDILOCKS`

1. 背景

接手了一个开发中的项目,技术栈如下:

  1. 数据库: TimeScaleDB(基于PostgreSQL,现已改名TigerData)
  2. ORM: Mybatis Plus
  3. 分页插件: Mybatis Plus自带的分页插件

2. 问题

  1. 分页插件的数据库类型DbType设置为DbType.POSTGRE_SQL时,分页查询报错:
    • Handler dispatch failed; nested exception is java.lang.NoSuchFieldError: GOLDILOCKS
  2. 分页插件的数据库类型DbType设置为DbType.MYSQL时,分页查询报错:
    • ERROR: LIMIT #,# syntax is not supported(MySQL支持, PostgreSQL语法为limit xx offset xx)

3. 心路历程

  1. 一开始我看分页插件配置如下(官方文档默认的):
    @Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}
  1. 我心想,我们数据库又不是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)
  1. 看上面应该是缺少数据库方言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;}
  1. 怀着忐忑的心情重新运行,正常.
    Perfect!!!

3. 感言

回顾了下查找解决方法的历程,苦于没有直接找到解决方法,故写下此文章以供相同问题的开发者参考.

http://www.dtcms.com/a/331515.html

相关文章:

  • 视频号主页的企业信息如何设置?
  • 深入了解linux系统—— 线程概念
  • Fiddler抓包
  • nginx --ssl证书生成mkcert
  • PCB爆板产生的原因有哪些?如何预防?
  • 第三十一天(系统io)
  • Qwen2-VL-2B 轻量化部署实战:数据集构建、LoRA微调、GPTQ量化与vLLM加速
  • 归并排序专栏
  • 机器学习基础讲解
  • Java -- HashSet的全面说明-Map接口的常用方法-遍历方法
  • feed-forward系列工作集合与跟进(vggt以后)
  • 第二十三天:求逆序对
  • Day54 Java面向对象08 继承
  • 附:日期类Date的实现
  • Pytorch在FSDP模型中使用EMA
  • Leetcode_1780.判断一个数字是否可以表示成三的幂的和
  • UE5 C++ 删除文件
  • BotCash:GPT-5发布观察 工程优化的进步,还是技术突破的瓶颈?
  • Spring Boot + Redis Cluster 测试
  • 回流(Reflow)与重绘(Repaint):浏览器渲染性能优化核心
  • 演员念真主演《镇恶追凶》辽宁杀青
  • 数字电路上的通讯速度是越快越好还是越慢越好?
  • 【二分图】染色问题
  • 企业智脑UMI AIGC SaaS:解锁AI时代全场景生产力,中小微企业转型利器
  • Linux学习-多任务(进程)
  • **隐私沙盒:发散创新之光**随着互联网技术的飞速发展,数据安全和隐私保护逐渐成为人们关注的焦点。隐私沙盒作为一种新兴
  • Ping32 与绿盾再对比:Ping32 以创新与适配领跑数据安全​
  • 机器学习内容总结
  • 机器学习-基础入门:从概念到核心方法论
  • MySQL进阶——优化、日志