开发者

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

开发者 https://www.devze.com 2025-05-31 10:26 出处:网络 作者: 振宇i
目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言 MyBATis的xml文件编写动态SQL是从mapper中获取传入的参数,但是如果是嵌套的子查询中,子查询动态SQL所需的参数不能像常规的那样直接从mapper中
目录
  • 前言
  • 一、实体类
    • 1、主类
    • 2、子类
  • 二、Mapper
    • 三、XML
      • 四、详解
        • 总结

          前言

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

          一、实体类

          1、主类

          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;
          }

          2、子类

          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" ckhfnwaYhayolumn="work_date"/>
                  <result property="createTime" column="create_time"/>
                  <colljsection 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"/>
              javascript    <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
            php      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
          javascript        <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参数

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

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

          总结

          以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

          0

          精彩评论

          暂无评论...
          验证码 换一张
          取 消

          关注公众号