0
点赞
收藏
分享

微信扫一扫

解决mybatis中字段类型为varchar,值为数字大小比较问题

问题描述:当我今天使用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>

注:仅供参考,具体还是要看自己的执行噢。







举报

相关推荐

0 条评论