mybatis中对于多条件if test传递参数为0

本文探讨了在使用MyBatis的ifTest标签时遇到的一个常见问题:当Long类型参数值为0时,ifTest条件判断失效的原因及解决办法。通过实际案例,揭示了在MyBatis SQL映射文件中,对于数字类型参数的条件判断应避免使用与空字符串比较的逻辑,以确保条件判断的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天工作中发现一个Long类型的参数没有传到sql中去,在sql xml配置文件中是使用if test标签判断:

 <if test="version != null and version != ''">and version = #{version,jdbcType=BigInt}</if>
 

version我传递的参数是0L

但是在sql执行时,总是判断没有传递此参数,所以没有添加此条件

后来才发现,0 !=null and 0 !=''语句中,0 !=null返回true,但是0 !=''返回false,  and运算符所以if test 语句返回false,为什么0 !=''返回false????(因为我传递的是包装类型Long,因为包装类型除了有值的情况就是null,不会为""空字符串的,String类型不在我讨论的范围内,标题已经说了是数字0,况且如果是String的话就不会有这个问题了。

解决办法:就是把0 !=''直接去掉。修改如下:

<if test="version != null">and version = #{version,jdbcType=BigInt}</if>

### MyBatis 动态 `HAVING` 子句实现多条件查询 在MyBatis中,为了实现在SQL语句中的`HAVING`子句动态添加多个查询条件,通常会利用MyBatis的动态SQL特性。通过使用 `<if>` 和 `<where>` 标签来构建灵活的查询逻辑[^1]。 下面是一个具体的例子展示如何基于传入参数对象,在Mapper XML文件内定义带有可选`HAVING`过滤器的SQL: ```xml <select id="selectByConditions" parameterType="map" resultType="com.example.Result"> SELECT * FROM sales_data sd GROUP BY sd.product_id <trim prefix="HAVING" prefixOverrides="AND |OR "> <if test="minSales != null"> AND SUM(sd.sales_amount) >= #{minSales} </if> <if test="maxSales != null"> AND SUM(sd.sales_amount) <= #{maxSales} </if> <if test="productCategory != null"> AND sd.category IN <foreach item="item" index="index" collection="productCategory" open="(" separator="," close=")"> #{item} </foreach> </if> </trim> </select> ``` 上述代码片段展示了如何根据输入参数决定哪些`HAVING`条件应该被加入最终执行的SQL语句中。这里的关键在于使用了`<trim>`标签配合特定前缀(`prefix`)以及要移除的前置字符(`prefixOverrides`),这使得即使某些条件未满足也不会破坏整个SQL结构。 对于Java端,则可以通过传递Map或者其他自定义POJO类作为参数给这个方法调用来指定实际使用的筛选标准: ```java // 使用 Map 作为参数的例子 Map<String, Object> params = new HashMap<>(); params.put("minSales", 50); params.put("maxSales", 200); params.put("productCategory", Arrays.asList("Electronics", "Books")); List<Result> results = sqlSession.selectList("namespace.selectByConditions", params); ``` 这种做法不仅提高了灵活性而且保持了良好的性能表现,因为只有真正需要应用的条件才会编译进入最后发送至数据库服务器的命令里。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值