mybatis-plus 连接oracle数据库查询无任何报错 Row: 0

当项目从MySQL切换到Oracle数据库后,遇到查询不到数据的问题。经过排查,发现是Mybatis-Plus的分页拦截器在执行含有条件的查询时,因字段status后的空格导致查询错误。解决方法是使用trim函数去除空格。问题根源在于数据同步时MySQL的char类型在Oracle中变为nchar,同步后字段末尾出现空格。Navicat可能自动处理了这一问题。

写在前面

这个坑我爬了很久,写的废话比较多,但是也不枉是一个比较好的解决问题的思路。若你非常着急,可以直接看总结,希望能帮到你。

背景

  项目中原先使用了mysql数据库,后来需要改为使用Oracle。使用了Navicat的数据同步功能,将表结构与数据傻瓜式同步过去了。

导入oracle的依赖,启动项目一切正常。但在执行具体的业务操作的时候发现找不到数据,控制台无任何报错,检查同步过来的数据库中的表又确实有数据。

百思不得其解,开启了Mybatis-plus的debug日志。观察日志发现,这个并没有执行到具体的语句,而是被mybatis-plus的分页拦截器拦截了。

问题分析

mybatis-plus的分页拦截器原理并不复杂,只是在你执行对应的select语句的时候,根据你连接的数据库自动在对应位置插入分页语句。比如mysql就是limit…offset…,oracle就是rownum<…

但是它能做的并不只有这个,它可以进行分页查询语句的优化。比如说你的查询语句是很长的left join语句,它会先统计一下总数(select count(1)),如果row等于0,就说明你的表中并没有记录,则将后续真正执行的查询语句给拦截掉了,不放行。我在项目中也配置了这个查询优化。

我花费大量的精力在拦截器上,我认为就是拦截器执行的语句有问题,我查阅了大量的资料,关于Mybatis-plus的拦截配置,百度上有人说是mybatis-plus的版本问题,有人说是oracle数据库的驱动问题……

花费大量时间无果,我将控制台打印的查询总数的语句复制到Navicat中执行,统计的总数也是0。

我感到绝望,认为是mybatis-plus的分页查询不好使,准备移除分页拦截器,引入pagehelper。这时候我突然想到,那移除了分页拦截器,先看看具体的语句能不能执行先。移除后执行,很失望,还是不行。控制台确实打印出具体要执行的语句了,拦截器的统计总数语句消失,日志上打印的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值