项目场景:
项目场景:系统框架SSM,需求需要设置一个定时任务,该任务需要扫描表A中某个字段不为1的数据,然后去配置表B拉取字段更新到表A
问题描述:
在生产中扫描表A中某个字段不为1的数据的时候,发现某部分数据没扫描到 代码:
GetBillExample.Criteria criteria = getBillExample.createCriteria();
criteria.andInterfaceTypeNotEqualTo("1");
List<GetBill> list = getBillMapper.selectByExample(getBillExample);
原因分析:
就是这么一段简单的代码,出现问题,原因是数据库中表A的字段interface_type既有null也有""空字符串的数据,而mybatis-generator生成器中对NotEqualTo的表述为<>,也就是相当于!=,而null是不包含在内的,测试结果如下:
解决方案:
要么就查询的时候查的范围开放,在代码层处理,要么就在sql层面加多个or,但是考虑到mybatis-generator对or的支持并不友好,因此建议在放大查询范围代码层面控制。
扩展:null和""在数据库mysql的存储不一样,根据官方文档,null是占用存储空间的,而""是不占用存储空间的。