起因
项目在生产环境中有接口报了以下的错:
Error querying database. Cause: org.apache.ibatis.builder.BuilderException: Error evaluating expression ‘criteria.valid’. Cause: org.apache.ibatis.ognl.NoSuchPropertyException: cn.com.xxx.xxx.dao.ibatis.Critirias$Criteria.valid
该接口功能为:调用外部接口查询额度,根据返回的额度更改明细表,并且计算总额更新汇总表信息,然后将汇总后额度信息推送给其他系统。
明细表大概有400万条数据左右
汇总表大概有十几万条数据左右
排查原因
首先,我是先看了报错的信息,发现所有的错误都指向Mybatis代码自动生成的example类中的Criteria.valid,于是我打开该类,发现了以下字段:
/**
* 当前查询实例
*/
protected List<Criteria> oredCriteria;
于是,我又去看了对应的Mapper.xml,发现每次在调用selectByExample和updateExample方式时,执行过程是这样的:
1. 判断example不等于null
2. 循环example.oredCriteria
3. 判断当前criteria是否为空
到了第三步时,本次异常指向的Criteria.valid就出现了:
<if test="criteria.valid">
但当我返回example类中寻找valid字段时,发现并没有这个字段,只有一个isValid方法,而完整的异常日志中,确实也提到了这个方法:
public boolean