Mybatis空值关联的问题解析及解决方案

 更新时间:2024年01月14日 08:44:16   作者:檀越剑指大厂  
这篇文章给大家介绍了Mybatis空值关联的问题解析及解决方案,文中通过代码示例介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

一.问题描述

1.已知条件

已知 table_1 有 3 个字段 order_no,community_id,post_id

已知 table_2 也有 3 个字段 order_no,community_id,post_id

2.关联条件

现在需要将 table_1 和 table_2 进行关联,关联条件是 order_no,community_id,post_id 这 3 个字段,但是 order_no 不为 null,不过 community_id,post_id 是可能为 null,也可能不为 null

3.初步解法

如以下 SQL 所示,发现结果为空,没有查询到数据,实际是有数据,问题在于 community_id 和 post_id 对于空值的处理。

<select id="totalPageInfo" resultType="com.kwan.springbootkwan.entity.dto.CsdnTotalIncomeDTO">
    SELECT t1.receiver_nick_name AS nickName
    , SUM(t1.received_money) AS amount
    FROM table_1 t1 left join table_2 t2
    on t1.order_no = t2.order_no
           AND t1.community_id=t2.community_id
           AND t1.post_id=t2.post_id
    WHERE 1 = 1
    <if test="query.startDate != null">
        AND t1.receive_time <![CDATA[>= #{query.startDate}]]>
        AND t2.create_time <![CDATA[>= #{query.startDate}]]>
    </if>
    <if test="query.endDate != null">
        AND t1.receive_time <![CDATA[<= #{query.endDate}]]>
        AND t2.create_time <![CDATA[<= #{query.endDate}]]>
    </if>
    GROUP BY nickName
    ORDER BY amount DESC
</select>

二.解决方案

1.SQL 如下.

<select id="totalPageInfo" resultType="com.kwan.springbootkwan.entity.dto.CsdnTotalIncomeDTO">
    SELECT t1.receiver_nick_name AS nickName
    , SUM(t1.received_money) AS amount
    FROM table_1 t1 left join table_2 t2
    on t1.order_no = t2.order_no
    <![CDATA[
           AND t1.community_id   <=> t2.community_id
           AND t1.post_id<=> t2.post_id
    ]]>
    WHERE 1 = 1
    <if test="query.startDate != null">
        AND t1.receive_time <![CDATA[>= #{query.startDate}]]>
        AND t2.create_time <![CDATA[>= #{query.startDate}]]>
    </if>
    <if test="query.endDate != null">
        AND t1.receive_time <![CDATA[<= #{query.endDate}]]>
        AND t2.create_time <![CDATA[<= #{query.endDate}]]>
    </if>
    GROUP BY nickName
    ORDER BY amount DESC
</select>

2.解释说明

在这个 SQL 查询中,由于 community_id 和 post_id 可能为空,你可以通过使用 COALESCE 函数或 IFNULL 函数(具体取决于你使用的数据库系统)来处理可能的空值情况。

下面是一种修改方式,假设你使用的是 MySQL 数据库:

SELECT
    t1.receiver_nick_name AS nickName,
    SUM(t1.received_money) AS amount
FROM
    table_1 t1
LEFT JOIN
    table_2 t2 ON t1.order_no = t2.order_no
                        AND t1.community_id <=> t2.community_id
                        AND t1.post_id <=> t2.post_id
WHERE
    1 = 1
    <if test="query.startDate != null">
        AND t1.receive_time <![CDATA[>= #{query.startDate}]]>
        AND t2.create_time <![CDATA[>= #{query.startDate}]]>
    </if>
    <if test="query.endDate != null">
        AND t1.receive_time <![CDATA[<= #{query.endDate}]]>
        AND t2.create_time <![CDATA[<= #{query.endDate}]]>
    </if>
GROUP BY
    nickName
ORDER BY
    amount DESC

在这里,使用了 <=> 操作符,它在 MySQL 中用于处理 NULL 值的比较。如果 community_id 或 post_id 的其中一个是 NULL,那么 <=> 操作符会返回 true。

请根据你使用的数据库类型来调整语法。如果是其他数据库,可能会使用 COALESCE 或 IS NULL 等不同的语法。

到此这篇关于Mybatis空值关联的问题解析及解决方案的文章就介绍到这了,更多相关Mybatis空值关联内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 详解Java 类的加载机制

    详解Java 类的加载机制

    这篇文章主要介绍了Java 类的加载机制,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-08-08
  • JavaSE、JavaEE和JavaWeb三大工程目录详解

    JavaSE、JavaEE和JavaWeb三大工程目录详解

    这篇文章主要给大家介绍了关于JavaSE、JavaEE和JavaWeb三大工程目录的相关资料,很多对java不是很了解的同学在看到课程⼤纲的时候发现⾥⾯出现了JavaSE、JavaEE、JavaME、JavaWEB这些词,搞得⼀头雾⽔,需要的朋友可以参考下
    2023-07-07
  • spring boot项目实战之实现与数据库的连接

    spring boot项目实战之实现与数据库的连接

    在我们日常的开发过程中,肯定不可避免的会使用到数据库以及SQL 语句,下面这篇文章主要给大家介绍了关于spring boot项目实战之实现与数据库连接的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • SpringBoot-Session管理问题及处理

    SpringBoot-Session管理问题及处理

    本文介绍了SpringBoot中Session管理的多种实现方式,包括内存、Redis、数据库和缓存等,并详细分析了Session失效、并发访问、共享、数据丢失和性能问题,以及相应的解决策略,如延长超时时间、使用分布式Session、优化存取频率和确保Session安全等
    2026-04-04
  • SpringBoot框架实现支付和转账功能

    SpringBoot框架实现支付和转账功能

    在 Spring Boot 框架中实现支付和转账功能时,涉及到多个细节和注意点,这些功能通常需要高度的安全性、稳定性和可扩展性,本文介绍了实现支付和转账功能的一些关键点,需要的朋友可以参考下
    2024-08-08
  • SpringBoot获取ApplicationContext的3种方式

    SpringBoot获取ApplicationContext的3种方式

    这篇文章主要为大家详细介绍了SpringBoot获取ApplicationContext的3种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • Java Flink窗口触发器Trigger的用法详解

    Java Flink窗口触发器Trigger的用法详解

    Trigger(窗口触发器)决定了窗口(由 WindowAssigner 产生)什么时候调用窗口处理函数。可以根据指定的时间或数据元素条件来决定什么时候触发。本文将详细讲讲其用法,需要的可以参考一下
    2022-07-07
  • IDEA设置项目默认保存位置实现方式

    IDEA设置项目默认保存位置实现方式

    本文主要介绍了如何在IDEA中设置默认项目目录,首先打开IDEA设置界面,任选一个项目,然后在弹出的设置界面中选择Appearance下的Default project directory,选择想要的位置设置好后,点击apply和OK即可
    2026-04-04
  • Ibatis配置xml文件CDATA使用方法详解

    Ibatis配置xml文件CDATA使用方法详解

    这篇文章主要介绍了Ibatis配置xml文件CDATA使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Java响应式编程之Flux与SseEmitter深度解析(附详细代码)

    Java响应式编程之Flux与SseEmitter深度解析(附详细代码)

    这篇文章主要介绍了Java响应式编程之Flux与SseEmitter深度解析的相关资料,从需求分析、技术背景、使用方法、底层原理、性能对比到生产环境实战,全面解析了这两种技术的特点、应用场景及优缺点,需要的朋友可以参考下
    2026-01-01

最新评论