mybatis父查询中的参数传递到子查询中使用过程

 更新时间:2026年06月10日 14:46:57   作者:zjun1001  
本文详细介绍了在使用日期参数进行分表查询时,如何将参数作为数据库表返回值的一部分进行传递,并探讨了在父查询与子查询间传递复杂类型参数(如List)的方法,通过示例展示了如何在DAO层和Controller层实现这一功能

需求

数据库表是按照日期进行分表,查找数据时候,不同日期的数据到不同的表中查找,此时日期作为参数传递。

在有父、子查询的SQL语句时,希望子查询能够使用到父查询中的参数(如日期)。

实现

将参数作为数据库表返回值的某一列,进行传递。此时,可以在resultMap中获取到。

示例如下:

  • Dao层
List <PicMoreDetailVo> selectPicList(@Param("tableName") String tableName, @Param("picVo") PicManagerVo picManagerVo);
  • 父查询
<select id="selectPicList" resultMap="bagIdFromMonthTable">
        SELECT id,create_time,'${tableName}' as tableName FROM baginfo_${tableName} WHERE stationId = #{picVo.stationId} AND create_time BETWEEN #{picVo.startTime} AND #{picVo.endTime}
        ORDER BY create_time ${picVo.sort} LIMIT #{picVo.currentPageNo},#{picVo.pageSize}
    </select>
  • 父查询返回map
    <resultMap type="com.qxmz.vo.pic.PicMoreDetailVo" id="bagIdFromMonthTable">
        <id property="bagId" column="id"/>
        <id property="createTime" column="create_time"/>
        <collection property="picList" ofType="com.qxmz.vo.pic.PicMoreReqVo" select="selectPicListByBagIdFromMonthTable"
                    column="{id=id,tableName=tableName}">
        </collection>
    </resultMap>
  • 子查询
<select id="selectPicListByBagIdFromMonthTable" resultMap="picId">
		SELECT id,pic_url,isMainPic FROM baginfo_pic_${tableName} where bagInfo_id=#{id}
    </select>
  • 子查询返回map
<resultMap type="com.qxmz.vo.pic.PicMoreReqVo" id="picId">
        <id column="id" property="picId"/>
        <result column="isMainPic" property="isMainPic"/>
        <result column="pic_url" property="picUrl"/>
    </resultMap>

另类场景

在父子查询参数传递过程中,除上面String类型外,如果有list这种复杂类型参数,可以将list转为String类型进行传递,类似"a,b,c",然后再在子查询中转为list使用。

由于本人从没遇到过这种场景,下文仅仅作为演示。另外,对于这种场景,也可以考虑从业务上解决。

  • Controller层
    @GetMapping("/select/test")
    @ApiOperation(value = "select test", notes = "select test", httpMethod = "GET")
    public Object judgeStationList() {
        try {
            List<String> timeList = new ArrayList<>();
            timeList.add("2021-06-09 10:46:16");
            //timeList.add("2021-06-09 10:46:17");
            String timeListStr = StringUtils.strip(timeList.toString(), "[]");
            return bagInfoDao.parentSelect(timeListStr);
        } catch (Exception e) {
            logger.error("异常:{}", e);
            return "error";
        }
    }
  • Dao层
List<BagInfo> parentSelect(String timeListStr);
  • 父查询
    <select id="parentSelect" resultMap="testListMap">
        select id,create_time,'${timeListStr}' as childTimeListStr from baginfo_2021_06
        <where>
            <if test="timeListStr!=null and timeListStr!='' ">
                and create_time in
                <foreach item="time" collection="timeListStr.split(',')" open="(" separator="," close=")">
                    #{time}
                </foreach>
            </if>
        </where>
    </select>
  • 父查询返回Map
    <resultMap type="com.qxmz.vo.pic.PicMoreDetailVo" id="testListMap">
        <id property="bagId" column="id"/>
        <id property="createTime" column="create_time"/>
        <collection property="picList" ofType="com.qxmz.vo.pic.PicMoreReqVo" select="childSelect"
                    column="{id=id,childTimeListStr=childTimeListStr}">
        </collection>
    </resultMap>
  • 子查询
    <select id="childSelect" resultType="com.qxmz.vo.pic.PicMoreReqVo">
        select id picId,isMainPic,pic_url picUrl from baginfo_pic_2021_06
        <where>
            bagInfo_id=#{id}
            <if test="childTimeListStr!=null and childTimeListStr!='' ">
                and create_time in
                <foreach item="time" collection="childTimeListStr.split(',')" open="(" separator="," close=")">
                    #{time}
                </foreach>
            </if>
        </where>
    </select>

总结

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

相关文章

  • 基于JVM性能监控命令介绍

    基于JVM性能监控命令介绍

    下面小编就为大家带来一篇基于JVM性能监控命令介绍。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 基于Java实现获取本地IP地址和主机名

    基于Java实现获取本地IP地址和主机名

    这篇文章主要介绍了基于Java实现获取本地IP地址和主机名,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java编程实现打地鼠文字游戏实例代码

    Java编程实现打地鼠文字游戏实例代码

    这篇文章主要介绍了Java编程实现打地鼠文字游戏实例代码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • 浅析Spring获取Bean的九种方法详解

    浅析Spring获取Bean的九种方法详解

    随着SpringBoot的普及,Spring的使用也越来越广,在某些场景下,我们无法通过注解或配置的形式直接获取到某个Bean。比如,在某一些工具类、设计模式实现中需要使用到Spring容器管理的Bean,此时就需要直接获取到对应的Bean,这篇文章主要介绍了Spring获取Bean的九种方法
    2023-01-01
  • Java并发编程之Semaphore详解

    Java并发编程之Semaphore详解

    这篇文章主要介绍了Java并发编程之concurrent包中的Semaphore详解,信号量Semaphore一般用来表示可用资源的个数,相当于一个计数器,可类比生活中停车场牌子上面显示的停车场剩余车位数量,需要的朋友可以参考下
    2023-12-12
  • Windows安装两个或多个JDK并实现自由切换的方法

    Windows安装两个或多个JDK并实现自由切换的方法

    最近新接手一个项目,启动的时候,发现有些jar和现在正在使用的JDK版本不一致,一直启动有问题,想着就多装一个JDK,由于为了保证java的运行环境和编译环境保持一致,就需要我们设置jdk的环境变量,所以本文给大家介绍了Windows安装两个或多个JDK并实现自由切换的方法
    2025-03-03
  • 浅谈一下RabbitMQ、Kafka和RocketMQ消息中间件对比

    浅谈一下RabbitMQ、Kafka和RocketMQ消息中间件对比

    这篇文章主要介绍了浅谈一下RabbitMQ、Kafka和RocketMQ消息中间件对比,消息中间件属于分布式系统中一个字系统,关注于数据的发送和接收,利用高效可靠的异步信息传递机制对分布式系统中的其余各个子系统进行集成,需要的朋友可以参考下
    2023-05-05
  • springboot接口参数为List的问题

    springboot接口参数为List的问题

    这篇文章主要介绍了springboot接口参数为List的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Spring中过滤器和拦截器的区别及具体实现方式

    Spring中过滤器和拦截器的区别及具体实现方式

    在Spring框架中,和都是用于处理 HTTP 请求的中间件,但它们在作用范围、实现方式和生命周期上有显著区别,本文给大家介绍Spring中过滤器和拦截器的区别及具体实现,感兴趣的朋友一起看看吧
    2025-07-07
  • Java NIO Path接口和Files类配合操作文件的实例

    Java NIO Path接口和Files类配合操作文件的实例

    下面小编就为大家分享一篇Java NIO Path接口和Files类配合操作文件的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11

最新评论