Mybatis中 list.size() = 1 但显示 All elements are null

一、Bug展示

二、原因分析

2.1.情形一:Mybatis的XML中返回类型映射错误

复制代码
<select id="selectByDesc" parameterType="com.task.bean.OrderInfo"
            resultType="com.task.bean.OrderInfo">
        select MER_ID,SETTLE_DATE,ICE_NAME,ORDER_STATUS,ORDER_CODE,ORDER_DESC,
        COUNT(*) AS SUM_COUNT,SUM(ORDER_AMT) AS SUM_AMT
        FROM order_info_${ny}
        <where>
            <if test="settleDate != null and settleDate != ''">
                AND SETTLE_DATE = #{settleDate}
            </if>
        </where>
        GROUP BY SETTLE_DATE
</select>

在此时,resultType中对应的是实体bean,但由于参数不完全对应或参数类型不完全匹配,造成查询到的数据不能正常返回。此时可以调整实体bean或修改xml,使字段完全对应;或者使用resultMap重新定义返回参数,示例如下:

复制代码
<resultMap id="orderInfo" type="com.task.bean.OrderInfo">
        <result property="orderId" column="ORDER_ID"/>
        <result property="merId" column="MER_ID"/>
        <result property="merName" column="MER_NAME"/>
 
        *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
 
        <result property="sumCount" column="SUM_COUNT"/>
</resultMap>
 
 
 
 
<select id="selectByDesc" parameterType="com.task.bean.OrderInfo"
            resultMap="orderInfo">    
        select MER_ID,SETTLE_DATE,ICE_NAME,ORDER_STATUS,ORDER_CODE,ORDER_DESC,
        COUNT(*) AS SUM_COUNT,SUM(ORDER_AMT) AS SUM_AMT
        FROM order_info_${ny}
        <where>
            <if test="settleDate != null and settleDate != ''">
                AND SETTLE_DATE = #{settleDate}
            </if>
        </where>
        GROUP BY SETTLE_DATE
</select>

2.2.情形二:使用了MySQL中的聚合函数

在使用MySQL中的聚合函数,分别是求和函数SUM()、求平均函数AVG()、最大值函数MAX()、最小值函数MIN()和计数函数COUNT, 进而导致出现size = 1,但结果为空的情况。

此时无论是否数据库中是否有值 , 返回都不为空。通过上面debug步骤发现, list.size() = 1,但List中值为空, 显示All elements are null

此时在无法优化xml的情况下,可以调整业务层代码,例如:

复制代码
if (CollectionUtils.isNotEmpty(listData) && listData.get(0) != null) {
    
    *  *  *  *  *  *  *  *  *  *  *  *  *  *  *
 
}

手动将这种情况给排除掉。或者,先把list中的null元素给排除掉,然后在进行业务的数据处理

复制代码
//移除第一个null
 
list.remove(null); 
 
//或移除所有的null元素
 
list.removeAll(Collections.singleton(null)); 

三、聚合函数

Java 使用聚合函数查询时,返回的结果一定不为null的原因是聚合函数的定义决定了它们的行为。聚合函数用于对一组值进行计算,并返回一个结果。根据聚合函数的定义,它们总是返回一个非空的结果,即使输入为空或无效。这是为了确保计算的一致性和可靠性。

举个例子,如果你使用 SUM() 聚合函数计算一组数值的总和,即使输入为空,它也会返回0作为结果。同样地,如果你使用 AVG() 聚合函数计算一组数值的平均值,即使输入为空,它也会返回0作为结果。

因此,Java 使用聚合函数查询时,可以确保返回的结果一定不为null,而是根据聚合函数的定义返回一个合适的值。同样的,这也造成数据在一定情况下需要手动排查掉NULL的情况。

转自:Mybatis中 list.size() = 1 但显示 All elements are null_棒棒糖的糖不含糖的博客-CSDN博客

相关推荐
爱的叹息9 小时前
Spring和Spring Boot集成MyBatis的完整对比示例,包含从项目创建到测试的全流程代码
spring boot·spring·mybatis
与秋逐鹿¥17 小时前
在Mybatis中为什么要同时指定扫描mapper接口和 mapper.xml 文件,理论单独扫描 xml 文件就可以啊
java·tomcat·mybatis
爱的叹息17 小时前
MyBatis 插件开发的完整详细例子
mybatis
Minyy111 天前
SpringBoot程序的创建以及特点,配置文件,LogBack记录日志,配置过滤器、拦截器、全局异常
xml·java·spring boot·后端·spring·mybatis·logback
北辰浮光1 天前
[Mybatis-plus]
java·开发语言·mybatis
方圆想当图灵1 天前
由 Mybatis 源码畅谈软件设计(七):SQL “染色” 拦截器实战
后端·mybatis·代码规范
毅航1 天前
MyBatis 事务管理:一文掌握Mybatis事务管理核心逻辑
java·后端·mybatis
啊松同学2 天前
【Mybatis】MyBatisPlus的saveBatch真的是批量插入吗?深度解析与性能优化
java·后端·性能优化·mybatis
阿里小阿希2 天前
解决 Spring Boot + MyBatis 项目迁移到 PostgreSQL 后的数据类型不匹配问题
spring boot·postgresql·mybatis
凯酱2 天前
MyBatis-Plus分页插件的使用
java·tomcat·mybatis