本文主要是介绍Mybatis嵌套子查询动态SQL编写实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍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" 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编写实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!