Mybatis嵌套子查询动态SQL编写实践

 更新时间:2025年05月30日 14:25:30   作者:振宇i  
这篇文章主要介绍了Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

Mybatis的xml文件编写动态SQL是从mapper中获取传入的参数,但是如果是嵌套的子查询中,子查询动态SQL所需的参数不能像常规的那样直接从mapper中获取, 因为嵌套子查询中能获取的传参仅能来源于主查询中的结果,如下文所示,即如何去解决这一问题

一、实体类

主类

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
import java.util.List;

@Schema(description = "返回结果实体 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MainDataRespVO extends MainDataBaseVO {

    @Schema(description = "主键ID")
    private Long id;

    @Schema(description = "创建时间")
    private LocalDateTime createTime;

    @Schema(description = "子类详情列表")
    private List<SubDataRespVO> subDataList;
}

子类

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;

@Schema(description = "管理后台 - 子类实体信息 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SubDataRespVO extends SubDataBaseVO {

    @Schema(description = "主键ID")
    private Long subDataId;

    @Schema(description = "创建时间"D)
    private LocalDateTime createTime;
}

二、Mapper

List<MainDataRespVO> getMainDataList( @Param("localDateStart") String localDateStart,
                                            @Param("localDateEnd") String localDateEnd,
                                            @Param("shiftType") String shiftType,
                                            @Param("userId") Long userId);

三、XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xxx.MainDataMapper">

    <resultMap id="selectShiftDateList" type="xxx.MainDataRespVO">
        <id property="id" column="id"/>
        <result property="workDate" column="work_date"/>
        <result property="createTime" column="create_time"/>
        <collection property="subDataList"
                    javaType="list"
                    ofType="xxx.vo.SubDataRespVO"
                    select="selectSubDataList"
                    column="{id=id, shiftType=shiftType, userId=userId}">
        </collection>
    </resultMap>

    <resultMap id="selectSubDataListMap" type="xxx.vo.SubDataRespVO">
        <result property="subDataId" column="id"/>
        <result property="createTime" column="create_time"/>
        <result property="userName" column="userName"/>
        <result property="shiftType" column="shift_type"/>
        <result property="userId" column="user_id"/>
        <result property="shiftDateId" column="shift_date_id"/>
    </resultMap>

    <select id="selectSubDataList" resultMap="selectSubDataListMap">
        select
        t2.id,
        t2.shift_date_id,
        t2.shift_type,
        t2.create_time,
        t2.user_id
        from sub_data t2
        where t2.main_data_id = #{id} and t2.deleted = 0
        <if test="shiftType!=null and shiftType != ''">
            and t2.shift_type = #{shiftType}
        </if>
        <if test="userId!=null and userId != ''">
            and t2.user_id =  #{userId}
        </if>
        order by t2.create_time asc
    </select>

    <select id="getMainDataList" resultMap="selectMainDataList">
        select
        t1.id,
        t1.work_date,
        t1.create_time,
        #{shiftType} as shiftType,  <!-- 将外部参数作为常量列 -->
        #{userId} as userId        <!-- 将外部参数作为常量列 -->
        from main_data t1
        where t1.deleted = 0
        <if test="localDateStart!=null and localDateStart != ''">
            and t1.work_date >=  #{localDateStart}
        </if>
        <if test="localDateEnd!=null and localDateEnd != ''">
            and #{localDateEnd} >= t1.work_date
        </if>
        order by t1.work_date asc
    </select>

</mapper>

四、详解

如下图所示,将mapper中需要传入子查询中的动态SQL参数,放到主查询的查询列表中去,取别名,别名即是传入到子查询中的动态SQL参数

总结

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

相关文章

  • feign的ribbon超时配置和hystrix的超时配置说明

    feign的ribbon超时配置和hystrix的超时配置说明

    这篇文章主要介绍了feign的ribbon超时配置和hystrix的超时配置说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java中的CurrentHashMap源码详解

    Java中的CurrentHashMap源码详解

    这篇文章主要介绍了Java中的CurrentHashMap源码详解,HashMap是数组+链表构成的,JDK1.8之后,加入了红黑树,HashMap默认数组初始化大小为16,如果瞎设置数字,它会自动调整成2的倍数,需要的朋友可以参考下
    2023-12-12
  • 关于使用MyBatis简化JDBC开发和解决SQL语句警告的问题

    关于使用MyBatis简化JDBC开发和解决SQL语句警告的问题

    这篇文章主要介绍了关于使用MyBatis简化JDBC开发和解决SQL语句警告的问题,如果idea和数据库没有建立链接,idea不识别表的信息,就会出现SQL语句的警告,需要的朋友可以参考下
    2023-05-05
  • SpringCloud Nacos作为配置中心超详细讲解

    SpringCloud Nacos作为配置中心超详细讲解

    这篇文章主要介绍了Springcloud中的Nacos作为配置中心,本文以用户微服务为例,进行统一的配置,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • SpringBoot实现六边形架构的三种不同方式详解

    SpringBoot实现六边形架构的三种不同方式详解

    六边形架构,也被称为端口与适配器架构或洋葱架构,是一种将业务逻辑与外部依赖解耦的架构模式,本文将介绍在SpringBoot中实现六边形架构的三种不同方式
    2025-06-06
  • Java中RabbitMQ消息队列的交换机详解

    Java中RabbitMQ消息队列的交换机详解

    这篇文章主要介绍了Java中的RabbitMQ交换机详解,消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成,是在消息的传输过程中保存消息的容器,需要的朋友可以参考下
    2023-07-07
  • Spring Boot Gradle发布war到tomcat的方法示例

    Spring Boot Gradle发布war到tomcat的方法示例

    本篇文章主要介绍了Spring Boot Gradle发布war到tomcat的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • IntelliJ IDEA导入Gradle项目的方法

    IntelliJ IDEA导入Gradle项目的方法

    这篇文章主要介绍了IntelliJ IDEA导入Gradle项目的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 一次踩坑记录 @valid注解不生效 排查过程

    一次踩坑记录 @valid注解不生效 排查过程

    这篇文章主要介绍了一次踩坑记录 @valid注解不生效 排查过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java Collection 体系与使用场景多角度分析

    Java Collection 体系与使用场景多角度分析

    本文从抽象层级、接口设计和实际使用场景三个角度,系统介绍了Java Collection框架,文章详细说明了Collection的基本概念、Collection在体系中的位置、为什么要有Collection接口以及在不同场景下的使用建议,感兴趣的朋友跟随小编一起看看吧
    2026-01-01

最新评论