mybatis使用foreach查询不出结果也不报错的问题
作者:HYDMonster 发布时间:2023-11-24 22:36:17
标签:mybatis,foreach,查询结果
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>
来源:https://blog.csdn.net/HYDMonster/article/details/87909731


猜你喜欢
- 这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 前言 GMap.NET是一个强大、免费、跨平台、开源的.NET控件。分为WPF和winform版。GMap.NET的基本知识不做过
- 说起双亲委派模型,不得不说一下类加载器。类加载器是什么?当我们编译Java类时,JVM会创建与平台和机器无关的字节码。字节码存储在.clas
- 1.多节点无缝切换问题分布式节点中的服务宕机或者重启不影响客户端使用分布式节点中的服务宕机重启不影响业务服务内部通信如果在某个分布式系统中想
- springboot 2.0 mybatis mapper-locations扫描多个路径mapper-locations扫描多个路径,中间
- 场景:当我们正在master分支开发新功能的时候,突然接到一个任务发现线上出现了一个紧急的BUG需要修复,由于没有打新分支做这部分新需求,这
- 本文实例为大家分享了C#实现chart控件动态曲线绘制的具体代码,供大家参考,具体内容如下思想实验室要做一个动态曲线绘制,网上方法很多,但是
- 题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数例如在数组{7
- 先给出具体代码(当前目录为:D:\pro):package org.test;public class TestJava{ pu
- List集合相信大家在开发过程中几乎都会用到。有时候难免会遇到集合里的数据是重复的,需要进行去除。然而,去重方式有好几种方式,你用的是哪种方
- Android能用来存储的地方有两个,一个是手机内置的存储空间,一个是外置的SD卡,内置的存储空间一般比较小,所以应用的缓存建议存储在外置的
- BeanUtils.copyProperties忽略空值使用spring开发的人,对这行代码肯定不陌生,常用于DTO、VO、PO之间的复制。
- 这里的万年历制作主要用到了Calendar类和GregorianCalendar类,我们先来回顾一下基础知识:基础部分一、Cal
- 作者:冰封一夏出处:http://www.cnblogs.com/bfyx/HZHControls官网:http://www.hzhcont
- 将Excel转为PDF格式时,通常情况下转换出来的PDF页面都是默认的宽度大小;如果Excel表格数据的设计或布局比较宽或者数据内较少的情况
- Servlet1 Servlet 简介Servlet就是Sun 公司开发动态web的一门技术Sun在这些API中提供一个接口叫做:Servl
- 前言在这一期的文章中,我将继续介绍 Either,使用它构建树形结构,该结构允许我模拟 Scala 的模式匹配来构建遍历方法。在 Java
- Task的应用Task的MSDN的描述如下:【Task类的表示单个操作不会返回一个值,通常以异步方式执行。Task对象是一种的中心思想基于任
- 本文实例讲述了Android编程实现获取当前连接wifi名字的方法。分享给大家供大家参考,具体如下:WifiManager wifiMgr
- 前言由于业务需要,后端需要返回一个树型结构给前端,包含父子节点的数据已经在数据库中存储好,现在需要做的是如何以树型结构的形式返给给前端。数据