今天在工作中使用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文件,可不是嘛!
3.解决方式
- 将以上对日期类型进行的非空判断去掉
- 将查询实体类改为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不拼接该部分,解决方案跟第一个问题的解决方案一致。