当前位置: 首页 > 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.lryc.cn/news/620817.html

相关文章:

  • week1-[分支结构]中位数
  • imx6ull-驱动开发篇24——Linux 中断API函数
  • Docker 入门与实战:从环境搭建到项目部署
  • Windows批处理脚本自动合并当前目录下由You-get下载的未合并的音视频文件
  • 【Unity3D实例-功能-移动】角色行走和奔跑的相互切换
  • AI智能体|扣子(Coze)搭建【批量识别发票并录入飞书】Agent
  • Cookie、Session、Token详解
  • 如何在 Ubuntu 24.04 LTS Noble Linux 上安装 Wine HQ
  • OpenCV对椒盐处理后的视频进行均值滤波处理
  • 短剧小程序系统开发:赋能创作者,推动短剧艺术创新发展
  • 【软件测试】自动化测试 — selenium快速上手
  • BitDock——让你的Windows桌面变为Mac
  • 如何查看SQL Server的当前端口
  • filezilla mac新版本MacOS-12.6.3会自动进入全屏模式BUG解决方法
  • 我的第一个开源项目-jenkins集成k8s项目
  • 软件测试中,常用的抓包工具有哪些?抓包的原理是什么?
  • FPGA读取AHT20温湿度模块思路及实现,包含遇到的问题(IIC协议)
  • 快速部署一个鉴黄服务
  • React数据请求
  • Android 项目:画图白板APP开发(二)——历史点、数学方式推导点
  • 2.0t的涡轮增压器结构设计说明书cad【5张】设计说明说
  • OpenSatKit技术详解
  • 《Leetcode》-面试题-hot100-动态规划
  • C++实现序列匹配与分类处理
  • 深度学习-卷积神经网络CNN-批量归一化 BatchNorm
  • React和Vue
  • React 中播放HLS 视频流 ,超简单的组件高度复用
  • 2019 GPT2原文 Language Models are Unsupervised Multitask Learners - Reading Notes
  • 微美全息(WIMI.US)借区块链与聚类技术,开启物联网去中心化安全架构新纪元
  • C#WPF实战出真汁03--登录功能实现