问题描述:当我今天使用mybatis中的example快速实现条件查询时,忽略了金额这个条件值在mysql中存储的字段类型,导致打断点执行了好几遍才发现问题的存在,浪费了好几倍的时间
因为varchar直接使用>、=、< 作比较,是指按照字典次序对单个字符或字符串进行比较大小的操作,一般都是以ASCII码值的大小作为字符比较的标准,字符串的数字比较会有误差
错误:
#serviceImpl使用example查询相关数据是
DbPaymentRecordExample example = new DbPaymentRecordExample();
example.setOrderByClause("create_time desc");
DbPaymentRecordExample.Criteria criteria = example.createCriteria();
criteria.andStudentIdEqualTo(studentId);
criteria.andMoneyGreaterThanOrEqualTo(payAmount); // 存在问题的条件
criteria.andPayStatusEqualTo("1");
List<DbPaymentRecord> paymentRecords = paymentRecordMapper.selectByExample(example);
#其中example层语句没问题,跟数据库字段类型有关系
public Criteria andMoneyGreaterThanOrEqualTo(String value) {
addCriterion("money >=", value, "money");
return (Criteria) this;
}
最终解决方案,还是向sql语句妥协了,使用了一个sql语句中的CAST函数,解决了该问题
<select id="findByStuMoney" resultMap="BaseResultMap">
SELECT
pr.*
FROM
db_payment_record pr
WHERE
pr.student_id = #{studentId} AND CAST(pr.money AS SIGNED) >= #{payAmount} AND pr.pay_status = 1
ORDER BY
create_time DESC
</select>
注:仅供参考,具体还是要看自己的执行噢。