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


    一、Bug展示

    二、原因分析

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

    1. <select id="selectByDesc" parameterType="com.task.bean.OrderInfo"
    2. resultType="com.task.bean.OrderInfo">
    3. select MER_ID,SETTLE_DATE,ICE_NAME,ORDER_STATUS,ORDER_CODE,ORDER_DESC,
    4. COUNT(*) AS SUM_COUNT,SUM(ORDER_AMT) AS SUM_AMT
    5. FROM order_info_${ny}
    6. <where>
    7. <if test="settleDate != null and settleDate != ''">
    8. AND SETTLE_DATE = #{settleDate}
    9. </if>
    10. </where>
    11. GROUP BY SETTLE_DATE
    12. </select>

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

    1. <resultMap id="orderInfo" type="com.task.bean.OrderInfo">
    2. <result property="orderId" column="ORDER_ID"/>
    3. <result property="merId" column="MER_ID"/>
    4. <result property="merName" column="MER_NAME"/>
    5. * * * * * * * * * * * * * * *
    6. <result property="sumCount" column="SUM_COUNT"/>
    7. </resultMap>
    8. <select id="selectByDesc" parameterType="com.task.bean.OrderInfo"
    9. resultMap="orderInfo">
    10. select MER_ID,SETTLE_DATE,ICE_NAME,ORDER_STATUS,ORDER_CODE,ORDER_DESC,
    11. COUNT(*) AS SUM_COUNT,SUM(ORDER_AMT) AS SUM_AMT
    12. FROM order_info_${ny}
    13. <where>
    14. <if test="settleDate != null and settleDate != ''">
    15. AND SETTLE_DATE = #{settleDate}
    16. </if>
    17. </where>
    18. GROUP BY SETTLE_DATE
    19. </select>

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

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

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

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

    1. if (CollectionUtils.isNotEmpty(listData) && listData.get(0) != null) {
    2. * * * * * * * * * * * * * * *
    3. }

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

    1. //移除第一个null
    2. list.remove(null);
    3. //或移除所有的null元素
    4. list.removeAll(Collections.singleton(null));

    三、聚合函数 

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

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

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

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

  • 相关阅读:
    蓝牙耳机热销榜是哪些?盘点性价比蓝牙耳机排行榜
    Nginx之正则表达式、location匹配简介及rewrite重写
    安装第三方包报错 error: Microsoft Visual C++ 14.0 or greater is required——解决办法
    什么是API网关?——驱动数字化转型的“隐形冠军”
    【牛客-算法】NC61 两数之和(哈希表的运用,C++)
    第02篇:手写JavaRPC框架之设计思路
    计算机网络知识整理笔记
    独立站活动怎么复盘,做独立站需要掌握哪些?-站斧浏览器
    电脑怎么备份文件?简单几步,轻松备份!
    c# xml 参数读取的复杂使用
  • 原文地址:https://blog.csdn.net/gaoshan12345678910/article/details/132585571