mybatis父查詢(xún)中的參數(shù)傳遞到子查詢(xún)中使用過(guò)程
需求
數(shù)據(jù)庫(kù)表是按照日期進(jìn)行分表,查找數(shù)據(jù)時(shí)候,不同日期的數(shù)據(jù)到不同的表中查找,此時(shí)日期作為參數(shù)傳遞。
在有父、子查詢(xún)的SQL語(yǔ)句時(shí),希望子查詢(xún)能夠使用到父查詢(xún)中的參數(shù)(如日期)。
實(shí)現(xiàn)
將參數(shù)作為數(shù)據(jù)庫(kù)表返回值的某一列,進(jìn)行傳遞。此時(shí),可以在resultMap中獲取到。
示例如下:
- Dao層
List <PicMoreDetailVo> selectPicList(@Param("tableName") String tableName, @Param("picVo") PicManagerVo picManagerVo);- 父查詢(xún)
<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>- 父查詢(xún)返回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>- 子查詢(xún)
<select id="selectPicListByBagIdFromMonthTable" resultMap="picId">
SELECT id,pic_url,isMainPic FROM baginfo_pic_${tableName} where bagInfo_id=#{id}
</select>- 子查詢(xún)返回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>另類(lèi)場(chǎng)景
在父子查詢(xún)參數(shù)傳遞過(guò)程中,除上面String類(lèi)型外,如果有l(wèi)ist這種復(fù)雜類(lèi)型參數(shù),可以將list轉(zhuǎn)為String類(lèi)型進(jìn)行傳遞,類(lèi)似"a,b,c",然后再在子查詢(xún)中轉(zhuǎn)為list使用。
由于本人從沒(méi)遇到過(guò)這種場(chǎng)景,下文僅僅作為演示。另外,對(duì)于這種場(chǎng)景,也可以考慮從業(yè)務(wù)上解決。
- 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);
- 父查詢(xún)
<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>- 父查詢(xún)返回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>- 子查詢(xún)
<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>總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 使用MyBatis XML和QueryWrapper實(shí)現(xiàn)動(dòng)態(tài)查詢(xún)
- 解決Mybatis一對(duì)多/多對(duì)多查詢(xún)時(shí)只查出了一條數(shù)據(jù)問(wèn)題
- mybatis-plus判斷參數(shù)是否為空并作為查詢(xún)條件方式
- MyBatis-Flex多表關(guān)聯(lián)查詢(xún)指南分享
- MyBatis-plus聚合查詢(xún)、表關(guān)聯(lián)、條件更新實(shí)踐
- MyBatisPlus之高級(jí)查詢(xún)用法及說(shuō)明
- Mybatis實(shí)現(xiàn)批量刪除和多條件查詢(xún)方式
相關(guān)文章
基于Java實(shí)現(xiàn)獲取本地IP地址和主機(jī)名
這篇文章主要介紹了基于Java實(shí)現(xiàn)獲取本地IP地址和主機(jī)名,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Java編程實(shí)現(xiàn)打地鼠文字游戲?qū)嵗a
這篇文章主要介紹了Java編程實(shí)現(xiàn)打地鼠文字游戲?qū)嵗a,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-11-11
Windows安裝兩個(gè)或多個(gè)JDK并實(shí)現(xiàn)自由切換的方法
最近新接手一個(gè)項(xiàng)目,啟動(dòng)的時(shí)候,發(fā)現(xiàn)有些jar和現(xiàn)在正在使用的JDK版本不一致,一直啟動(dòng)有問(wèn)題,想著就多裝一個(gè)JDK,由于為了保證java的運(yùn)行環(huán)境和編譯環(huán)境保持一致,就需要我們?cè)O(shè)置jdk的環(huán)境變量,所以本文給大家介紹了Windows安裝兩個(gè)或多個(gè)JDK并實(shí)現(xiàn)自由切換的方法2025-03-03
淺談一下RabbitMQ、Kafka和RocketMQ消息中間件對(duì)比
這篇文章主要介紹了淺談一下RabbitMQ、Kafka和RocketMQ消息中間件對(duì)比,消息中間件屬于分布式系統(tǒng)中一個(gè)字系統(tǒng),關(guān)注于數(shù)據(jù)的發(fā)送和接收,利用高效可靠的異步信息傳遞機(jī)制對(duì)分布式系統(tǒng)中的其余各個(gè)子系統(tǒng)進(jìn)行集成,需要的朋友可以參考下2023-05-05
springboot接口參數(shù)為L(zhǎng)ist的問(wèn)題
這篇文章主要介紹了springboot接口參數(shù)為L(zhǎng)ist的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Spring中過(guò)濾器和攔截器的區(qū)別及具體實(shí)現(xiàn)方式
在Spring框架中,和都是用于處理 HTTP 請(qǐng)求的中間件,但它們?cè)谧饔梅秶?shí)現(xiàn)方式和生命周期上有顯著區(qū)別,本文給大家介紹Spring中過(guò)濾器和攔截器的區(qū)別及具體實(shí)現(xiàn),感興趣的朋友一起看看吧2025-07-07
Java NIO Path接口和Files類(lèi)配合操作文件的實(shí)例
下面小編就為大家分享一篇Java NIO Path接口和Files類(lèi)配合操作文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11

