Mybatis嵌套子查询动态SQL编写实践
作者:振宇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参数


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