使用mybtis3.3.0时遇到的两个问题记录invalid comparison: java.util.Date and java.lang.String

今天在工作中使用mybatis3.3.0时,遇到了两个诡异的问题,记录下来,方便以后查阅。(本地环境为mybatis3.3.0+postgresql)

一、invalid comparison: java.util.Date and java.lang.String

1.问题出现场景
在这里插入图片描述
post方式发送请求:
在这里插入图片描述
结果后台出现以下报错

2021-12-16 15:42:59.618 [http-nio-8343-exec-3] ERROR o.a.c.c.C.[.[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
### Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String] with root cause
java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

在这里插入图片描述
2.问题出现原因

在网上查阅资料发现,mybatis3.3.0之后的版本,如果在mapper.xml有对date类型的字段进行“ !=’ ’ ”的判断,由于使用日期类型与字符串进行比较,就会出现该问题

看了一下我自己的查询实体类以及mapper文件,可不是嘛!
在这里插入图片描述
图2
3.解决方式

  1. 将以上对日期类型进行的非空判断去掉
  2. 将查询实体类改为String类型

这里就不放截图了,说一下接下来遇到的另一个问题

二、根据int类型的标志字段查询数据没有效果

首先我的查询实体类里有个int类型的标志字段,0代表未发布1代表已发布
在这里插入图片描述
使用post请求以下接口
在这里插入图片描述
后台倒是好好的没报错并正确返回了数据,结果神奇的发现响应数据中竟然有sffb为1的数据!!!
在这里插入图片描述
仔仔细细检查了一遍xml中的sql和代码,发现没有任何问题,debug发现sffb=0也确确实实传到后台了,又将xml中的sql复制到navicat中,发现在navicat中只查询出了sffb=0的数据,啊咧,见鬼了!

于是乎,将sffb改为1再调一次接口,发现这下出来的都是sffb为1的正常数据,没有出乎意料的数据。

就在不知所措时,突然间发现控制台打印的sql并没有拼接它本应该拼接的sffb=0的条件,这就反应出mybatis并没有走xml中写的sffb判定条件分支,如下

在这里插入图片描述
看到这里感觉很眼熟,没错,跟上一个问题很相似,问题很可能还是出在" !=’ ’ "中,于是将该判断去掉,再次发送请求,发现查出来的只有sffb为0的结果了。

在这里插入图片描述

到这里就明白了,当int类型的字段为0时,通过mybaits的“ != ’ ’ ”判定结果为false,导致了最终的sql不拼接该部分,解决方案跟第一个问题的解决方案一致。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值