mybatis使用foreach查询不出结果也不报错的问题

 更新时间:2022年03月22日 16:59:06   作者:HYDMonster  
这篇文章主要介绍了mybatis使用foreach查询不出结果也不报错的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

foreach查询不出结果也不报错问题

首先,执行的时候语法没有报错,其次sql语句拿到数据库去执行能查到数据,但是在接口这边返回空输数据,查看控制台发现sql语句执行了,但是返回结果为0。此时猜想是传入参数的问题。

执行结果

此时数组是直接从参数里接收

仔细看此时的数组和普通的数组还是有差别的

但是此时执行是没有问题的,但是查不到数据

正确执行结果

此时的数组

遍历输出

所以,由此可以看出是参数的问题

正确做法

由于接收到的数组是json数组,不能直接使用,要转成普通数组即可

前端传入参数(数组即可)

使用foreach、in操作注意点

mybatis语法掌握不熟,在写foreach操作时,造成in ()错误,这种情况不符合SQL的语法,导致程序报错。

如果简单只做非空判断,这样也有可能会有问题:本来in一个空列表,应该是没有数据才对,却变成了获取全部数据!

错误sql示例

<select id="getActiveCount" resultType="int" parameterType="com.missfresh.active.dto.ActiveSearchDTO">
? ? ? ? select count(1) from (
? ? ? ? SELECT
? ? ? ? distinct ?a.*
? ? ? ? FROM
? ? ? ? active AS a
? ? ? ? <if test="sku!='' and sku!=null">
? ? ? ? ? ? LEFT JOIN active_promotion AS ap ON ap.active_id = a.id
? ? ? ? ? ? LEFT JOIN promotion_product AS pp ON pp.promotion_id = ap.promotion_id
? ? ? ? </if>
? ? ? ? <if test="areaIds!='' and areaIds!=null">
? ? ? ? ? ? LEFT JOIN active_area AS aa ON aa.active_id = a.id and aa.status = 1 and aa.area_type = 0
? ? ? ? </if>
? ? ? ? WHERE a.status <![CDATA[!= ]]> 0
? ? ? ? <if test="id!=0 and id!=null">
? ? ? ? ? ? AND a.id = #{id}
? ? ? ? </if>
? ? ? ? <if test="name!='' and name!=null">
? ? ? ? ? ? AND a.name LIKE CONCAT('%',#{name},'%')
? ? ? ? </if>
? ? ? ? <if test="sku!='' and sku!=null">
? ? ? ? ? ? AND pp.sku = #{sku}
? ? ? ? </if>
? ? ? ? <!--判断方式错了,应该先用null再用size>0判断;如果areaIds为空,查询结果也应为空,而不是其他查询结果。所以sql有问题-->
? ? ? ? <if test="areaIds!='' and areaIds!=null">
? ? ? ? ? ? and aa.area_id IN
? ? ? ? ? ? <foreach item="item" index="index" collection="areaIds" open="(" separator="," close=")">
? ? ? ? ? ? ? ? #{item}
? ? ? ? ? ? </foreach>
? ? ? ? </if>
? ? ? ? order by a.create_time desc ) as b
? ? </select>

改正后的sql为

<select id="getActiveCount" resultType="int" parameterType="com.missfresh.active.dto.ActiveSearchDTO">
? ? ? ? select count(1) from (
? ? ? ? SELECT
? ? ? ? distinct ?a.*
? ? ? ? FROM
? ? ? ? active AS a
? ? ? ? <if test="sku!='' and sku!=null">
? ? ? ? ? ? LEFT JOIN active_promotion AS ap ON ap.active_id = a.id
? ? ? ? ? ? LEFT JOIN promotion_product AS pp ON pp.promotion_id = ap.promotion_id
? ? ? ? </if>
? ? ? ? <if test="areaIds!='' and areaIds!=null">
? ? ? ? ? ? LEFT JOIN active_area AS aa ON aa.active_id = a.id and aa.status = 1 and aa.area_type = 0
? ? ? ? </if>
? ? ? ? WHERE a.status <![CDATA[!= ]]> 0
? ? ? ? <if test="id!=0 and id!=null">
? ? ? ? ? ? AND a.id = #{id}
? ? ? ? </if>
? ? ? ? <if test="name!='' and name!=null">
? ? ? ? ? ? AND a.name LIKE CONCAT('%',#{name},'%')
? ? ? ? </if>
? ? ? ? <if test="sku!='' and sku!=null">
? ? ? ? ? ? AND pp.sku = #{sku}
? ? ? ? </if>
? ? ? ? <if test="areaIds!=null and areaIds.size > 0">
? ? ? ? ? ? and aa.area_id IN
? ? ? ? ? ? <foreach item="item" index="index" collection="areaIds" open="(" separator="," close=")">
? ? ? ? ? ? ? ? #{item}
? ? ? ? ? ? </foreach>
? ? ? ? </if>
? ? ? ? <!--加入这个非真条件-->
? ? ? ? <if test="areaIds==null or areaIds.size == ?0">
? ? ? ? and 1=0
? ? ? ? </if>
? ? ? ? order by a.create_time desc ) as b
? ? </select>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持程序员之家。

相关文章

  • 详解idea maven nexus 常见命令配置

    详解idea maven nexus 常见命令配置

    这篇文章主要介绍了idea maven nexus 常见命令配置的相关知识,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Spring?Boot与Spring?MVC?Spring对比及核心概念

    Spring?Boot与Spring?MVC?Spring对比及核心概念

    这篇文章主要为大家介绍了Spring?Boot与Spring?MVC?Spring的对比以及你需要了解的核心概念,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-03-03
  • java 中归并排序算法详解

    java 中归并排序算法详解

    这篇文章主要介绍了java 中归并排序算法详解的相关资料,归并排序算法又称为合并排序算法,是一种时间复杂度为O(N logN)的排序算法,因而其在平常生活工作中应用非常广泛,需要的朋友可以参考下
    2017-09-09
  • Java导出Word文档的实现方法详解

    Java导出Word文档的实现方法详解

    这篇文章主要给大家介绍了关于Java导出Word文档的实现方法,在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表、医院的患者统计报表、电商平台的销售报表等等,需要的朋友可以参考下
    2023-08-08
  • java map中相同的key保存多个value值方式

    java map中相同的key保存多个value值方式

    这篇文章主要介绍了java map中相同的key保存多个value值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 使用SpringBoot自定义starter详解

    使用SpringBoot自定义starter详解

    这篇文章主要介绍了使用Spring Boot自定义starter详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助哟,需要的朋友可以参考下
    2021-05-05
  • Java?获取Word中所有的插入和删除修订的方法

    Java?获取Word中所有的插入和删除修订的方法

    这篇文章主要介绍了Java?获取Word中所有插入和删除修订,在?Word?文档中启用跟踪更改功能后,会记录文档中的所有编辑行为,例如插入、删除、替换和格式更改。对插入或删除的内容,本文介绍获取方法,需要的朋友可以参考下
    2022-04-04
  • 浅谈利用Session防止表单重复提交

    浅谈利用Session防止表单重复提交

    这篇文章主要介绍了浅谈利用Session防止表单重复提交,简单介绍表单重复提交的情况,分析,以及解决方法代码示例,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • 关于Java8中map()和flatMap()的一些事

    关于Java8中map()和flatMap()的一些事

    这篇文章主要给大家介绍了关于Java8中map()和flatMap()的一些事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • java进行文件读写操作详解

    java进行文件读写操作详解

    这篇文章主要介绍了java进行文件读写操作详解的相关资料,需要的朋友可以参考下
    2014-10-10

最新评论

?


http://www.vxiaotou.com