MyBatis传入0值无返回结果的问题及解决咨询
问题原因与解决方案
核心问题分析
- JDBC类型不匹配:SQL里指定了
jdbcType=VARCHAR,但数据库列是numeric(20,2),RequestDto对应的字段是BigDecimal。把数值类型的BigDecimal以字符串类型传入数据库,会触发数据库隐式类型转换,导致amount >= '0'的比较逻辑异常,无法匹配到数据库中amount=0的行。 - 传入
amount=0时if test="amount!=null"条件是成立的,但参数绑定错误导致SQL执行结果不符合预期。
修改方案
直接修正SQL中的jdbcType为与数据库列匹配的数值类型,同时优化SQL结构避免语法错误:
select * from table <where> <if test="amount != null"> amount >= #{amount, jdbcType=NUMERIC} </if> </where>
补充说明
jdbcType=NUMERIC或jdbcType=DECIMAL均可,两者与数据库的numeric(20,2)类型兼容。- 使用
<where>标签能自动处理SQL中多余的where关键字,避免当amount为null时生成select * from table where这类无效SQL。 - 数据库中
amount列默认值为0且非空,修正后的SQL在传入amount=0时会正确生成amount >= 0,从而返回所有符合条件的数据行。
内容的提问来源于stack exchange,提问作者DEVELOPER JAVA
相关产品推荐
相关产品推荐

