当前位置: 首页 > news >正文

Mybatis 嵌套子查询动态SQL编写

前言:

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" 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">selectt2.id,t2.shift_date_id,t2.shift_type,t2.create_time,t2.user_idfrom sub_data t2where 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">selectt1.id,t1.work_date,t1.create_time,#{shiftType} as shiftType,  <!-- 将外部参数作为常量列 -->#{userId} as userId        <!-- 将外部参数作为常量列 -->from main_data t1where 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参数

相关文章:

  • QT6 源(103)篇三:阅读与注释 QPlainTextEdit,给出源代码
  • Mysql、Oracle、Sql Server、达梦之间sql的差异
  • 搭建游戏云服务器的配置要求包括哪些条件?
  • HOW - React NextJS 的同构机制
  • WebRTC中的几个Channel
  • 【网络编程】十、详解 UDP 协议
  • Python教程(五)——模块
  • c/c++的opencv的图像预处理讲解
  • MapReduce Shuffle 全解析:从 Map 端到 Reduce 端的核心数据流​
  • Spring bean 的生命周期、注入方式和作用域
  • C41-为什么要用指针
  • ubuntu环境下 基于Python 打包的 批量命令行可视化操作工具 GUI
  • Vue3项目使用ElDrawer后select方法不生效
  • 分布式 ID 生成的五种方法:优缺点与适用场景
  • 【C++】 —— 笔试刷题day_29
  • 界面控件DevExpress WinForms中文教程:Banded Grid View - API
  • 项目依赖版本修改
  • TensorFlow/Keras实现知识蒸馏案例
  • Tor推出Oniux新工具:为Linux应用提供网络流量匿名化
  • Graph Representation Learning【图最短路径优化/Node2vec/Deepwalk】
  • 出走的苏敏阿姨一路走到了戛纳,这块红毯因她而多元
  • 既是工具又是食物,可食用机器人开启舌尖上的新科技
  • 上交所五方面落实募资新规:强化关键少数责任和股东权利保障
  • 特朗普中东行:“能源换科技”背后的权力博弈|907编辑部
  • 欠债七十万后,一个乡镇驿站站长的中年心事
  • 习近平复信中国丹麦商会负责人