不多哔哔

问题

今天开发遇到一个问题 排查好长时间。

一个简单的查询 在mybatis 大概就是这个意思

select * from A where deleted = #{deleted}

测试的时候发现没有查出来数据。 根据日志中的sql 直接粘到 dbeaver 上

select * from A where deleted = '1'

就能查出来数据,蒙了- - 这问题很少见,排查了半天不知道问题出现在那里。

原因

后来直接在mapper 中写死 deleted 这个条件也可以查出来 用 $ 查询也可以查出来。而且只有这个字段有这个问题,
猜测问题应该出现在 某个字段上。 看了下字段类型 尼玛 是 char 类型。字段长度是10 。

oracle 中char类型 如果长度不够会自动补齐, 比如这个deleted 在库里就是 “1 ”
一般查询数据库会优化这个比如在sql 中写=‘1’ 这种就可以查出来, 而mybatis 中使用#查询 用的是参数化查询 所以就是精准匹配 。

解决方案
1 直接把字段类型给他改了 改成varchar
2 你自己手动把缺的长度给他补齐,
3 查询条件 中 deleted 字段使用函数去空格 TRIM()
4 不用占位符查询。$()
不推荐2,3
如果 使用4 的话 在入参类型上做一下限制比较好比如
入参:

class Params{

	private String nameEq;
	
	private YesOrNoEnum deleted;

}

mapper 中

where deleted = ${deleted.getCode()}
Logo

一站式 AI 云服务平台

更多推荐