mybatis?實(shí)現(xiàn)多層級(jí)collection嵌套
mybatis多層級(jí)collection嵌套
json結(jié)構(gòu)
第一步查詢
第一層查詢,將第一層的id傳遞到第二層當(dāng)條件查詢 column="id"
<resultMap id="BaseResultMapClass" type="com.kingyon.common.models.shortcut.ShortcutKeyClassBean"> <id column="id" jdbcType="INTEGER" property="id"/> <result column="title" jdbcType="VARCHAR" property="title"/> <result column="img" jdbcType="VARCHAR" property="img"/> <result column="bgColor" jdbcType="VARCHAR" property="bgColor"/> <result column="describe" jdbcType="VARCHAR" property="describe"/> <result column="type" jdbcType="BIGINT" property="type"/> <collection property="functionBeans" ofType="com.kingyon.common.models.shortcut.ShortcutKeyFunctionBean" select="com.kingyon.core.repository.ShortcutKeyMapper.getShortcutKeyFunction" column="id"> </collection> </resultMap>
<select id="findShortcutKeyByClassID" resultMap="BaseResultMapClass"> select * from t_shortcut_key_class where id=#{classID} ; </select>
第二步查詢
第二層查詢,并將第二層的id傳遞到第三層當(dāng)條件查詢 column="funID" 是別名
<resultMap id="baseShortcutKey" type="com.kingyon.common.models.shortcut.ShortcutKeyFunctionBean"> <id column="id" jdbcType="INTEGER" property="funID"/> <result column="classID" jdbcType="VARCHAR" property="classID"/> <result column="describe" jdbcType="VARCHAR" property="describe"/> <result column="sort" jdbcType="VARCHAR" property="sort"/> <result column="className" jdbcType="VARCHAR" property="className"/> <collection property="shortcutKeyBean" ofType="com.kingyon.common.models.shortcut.ShortcutKeyBean" select="com.kingyon.core.repository.ShortcutKeyMapper.getShortcutKey" column="funID"> </collection> </resultMap>
<select id="getShortcutKeyFunction" resultMap="baseShortcutKey"> select fun.id as funID,fun.classID,fun.describe,fun.sort from t_shortcut_key_function as fun where fun.classID=#{classID} order by sort DESC ; </select>
第三步查詢(第三層查詢)
<resultMap id="shortcutKeyBean" type="com.kingyon.common.models.shortcut.ShortcutKeyBean"> <result property="id" column="keyID"/> <result property="shortcut" column="shortcut"/> <result property="details" column="details"/> </resultMap>
<select id="getShortcutKey" resultMap="shortcutKeyBean"> select * from t_shortcut_key where funID=#{id}; </select>
其實(shí)蠻好理解的,就是查詢一個(gè),然后把條件傳遞下步繼續(xù)查詢。。。 使用時(shí)調(diào)第一層,也就是從高到底。
最后附實(shí)體截圖,其實(shí)看json就可以了
第一層實(shí)體:
第二層實(shí)體:
第三層實(shí)體:
方式二(推薦)
<resultMap id="chapter" type="com.xx.xx.xx.xx.xxBean"> ? ? <id column="id" property="id"/> ? ? <result column="name" property="name"/> ? ? <collection property="chapterChildBeans" ? ? ? ? ? ? ? ? ofType="com.xx.xx.mode.xx.xxBean"> ? ? ? ? <id column="cId" property="id"/> ? ? ? ? <result column="cName" property="name"/> ? ? </collection> </resultMap>
<select id="selectChapter" resultMap="chapter"> ? ? SELECT c.id,c.name,cc.id as cId,cc.name as cName from t_chapter c,t_chapter_child cc WHERE c.id=cc.chapterID and c.subjectID=#{subjectID} </select>
mybatis多層(三層)嵌套查詢
java 實(shí)體描述
/** * <p> * 家庭表 * </p> * * @author lohas */ @Data @EqualsAndHashCode(callSuper = true) @TableName("t_family_info") @ApiModel(value = "FamilyInfoEntity對(duì)象", description = "家庭表") public class FamilyInfoEntity extends Model { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主鍵") @TableId(value = "id", type = IdType.INPUT) private String id; @ApiModelProperty(value = "家庭名稱") private String familyName; @ApiModelProperty(value = "家庭頭像url") private String headUrl; @ApiModelProperty(value = "國(guó)家") private String country; @ApiModelProperty(value = "城市") private String city; @ApiModelProperty(value = "地址") private String address; @ApiModelProperty(value = "經(jīng)度") private BigDecimal longitude; @ApiModelProperty(value = "緯度") private BigDecimal latitude; @ApiModelProperty(value = "租戶ID") private String tenantId; @ApiModelProperty(value = "是否刪除(0:正常;低于0的數(shù)字:已刪除)") private String deleteFlag; @ApiModelProperty(value = "創(chuàng)建人ID") private String creatorId; @ApiModelProperty(value = "創(chuàng)建時(shí)間") @JsonDeserialize(using = LocalDateTimeSerializerConfig.LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializerConfig.LocalDateTimeSerializer.class) private LocalDateTime createTime; @ApiModelProperty(value = "更新人ID") private String updateId; @ApiModelProperty(value = "更新時(shí)間") @JsonDeserialize(using = LocalDateTimeSerializerConfig.LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializerConfig.LocalDateTimeSerializer.class) private LocalDateTime updateTime; }
/** * @author lohas * @description */ @Data @ApiModel(value = "RoomDeviceInfoVo對(duì)象", description = "房間設(shè)備信息實(shí)體") public class RoomDeviceInfoVo implements Serializable { @ApiModelProperty(value = "房間id") private String roomId; @ApiModelProperty(value = "房間名稱") private String roomName; @ApiModelProperty(value = "設(shè)備數(shù)量") private Integer deviceNum; @ApiModelProperty(value = "設(shè)備信息列表") private List<String> deviceIds; }
/** * @author lohas * @description */ @Data @ApiModel(value = "FamilyRoomInfoVo對(duì)象", description = "家庭房間信息對(duì)象實(shí)例") public class FamilyRoomInfoVo extends FamilyInfoEntity { @ApiModelProperty(value = "房間設(shè)備信息列表") private List<RoomDeviceInfoVo> roomDeviceInfoVoList; }
mybatis 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="com.lohas.mapper.FamilyInfoMapper"> <select id="getFamilyRoomInfoVoByUserId" resultMap="familyMap"> SELECT * FROM ( SELECT tfi.*, trf."id" AS r_room_id, --要加上r因?yàn)閏olumnPrefix="r_"(如果字段唯一,可以不加) trf.room_name AS r_room_name, --要加上r因?yàn)閏olumnPrefix="r_" trd.device_id AS r_d_device_id --要加上r因?yàn)閏olumnPrefix="r_",加上d因?yàn)閏olumnPrefix="d_" FROM t_user_family tuf LEFT JOIN t_family_info tfi ON tfi.ID = tuf.family_id LEFT JOIN t_family_room tfr ON tuf.family_id = tfr.family_id LEFT JOIN t_room_info trf ON tfr.room_id = trf.ID LEFT JOIN t_room_device trd ON tfr.room_id = trd.room_id WHERE tuf.user_id = #{userId} ORDER BY tfi.create_time DESC ) AS fr, ( SELECT trf."id" AS r_room_id, --要加上r因?yàn)閏olumnPrefix="r_" COUNT(trd.device_id) AS r_device_num --要加上r因?yàn)閏olumnPrefix="r_" FROM t_user_family tuf LEFT JOIN t_family_info tfi ON tfi.ID = tuf.family_id LEFT JOIN t_family_room tfr ON tuf.family_id = tfr.family_id LEFT JOIN t_room_info trf ON tfr.room_id = trf. ID LEFT JOIN t_room_device trd ON tfr.room_id = trd.room_id WHERE tuf.user_id = #{userId} GROUP BY trf."id" ) AS rd WHERE fr.r_room_id = rd.r_room_id </select> <resultMap id="familyMap" type="com.lohas.vo.FamilyRoomInfoVo"> <!-- 一層: 家庭信息--> <id column="id" jdbcType="VARCHAR" property="id"/> <result column="family_name" jdbcType="VARCHAR" property="familyName"/> <result column="head_url" jdbcType="VARCHAR" property="headUrl"/> <result column="country" jdbcType="VARCHAR" property="country"/> <result column="city" jdbcType="VARCHAR" property="city"/> <result column="address" jdbcType="VARCHAR" property="address"/> <result column="longitude" jdbcType="NUMERIC" property="longitude"/> <result column="latitude" jdbcType="NUMERIC" property="latitude"/> <result column="delete_flag" jdbcType="CHAR" property="deleteFlag"/> <result column="creator_id" jdbcType="VARCHAR" property="creatorId"/> <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/> <result column="update_id" jdbcType="VARCHAR" property="updateId"/> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/> <result column="tenant_id" jdbcType="VARCHAR" property="tenantId"/> <!-- 如果字段唯一,可以不加columnPrefix="r_"--> <collection property="roomDeviceInfoVoList" columnPrefix="r_" resultMap="roomMap"/> </resultMap> <resultMap id="roomMap" type="com.lohas.vo.RoomDeviceInfoVo"> <!-- 二層: 房間信息--> <result column="room_id" jdbcType="VARCHAR" property="roomId"/> <result column="room_name" jdbcType="VARCHAR" property="roomName"/> <result column="device_num" jdbcType="VARCHAR" property="deviceNum"/> <!-- 如果字段唯一,可以不加columnPrefix="d_"--> <collection property="deviceIds" columnPrefix="d_" resultMap="deviceMap"/> </resultMap> <resultMap id="deviceMap" type="string"> <!-- 三層: 設(shè)備信息--> <result column="device_id" jdbcType="VARCHAR"/> </resultMap> </mapper>
調(diào)用方法
public interface FamilyInfoMapper extends BaseMapper<FamilyInfoEntity> {? ?? ?List<FamilyRoomInfoVo> getFamilyRoomInfoVoByUserId(@Param("userId") String userId); ?? }
注意總結(jié)
如果你的字段唯一,columnPrefix="r_" 和 columnPrefix="d_",可以不加,如果你加上了columnPrefix記得在字段上拼接上,否則查詢不出數(shù)據(jù),拼接要有前后順序拼接例如:
<collection property="roomDeviceInfoVoList" columnPrefix="r_" resultMap="roomMap"/> <collection property="deviceIds" columnPrefix="d_" resultMap="deviceMap"/> r_d_device_id(要加上r因?yàn)閞oomMap columnPrefix="r_",加上d因?yàn)閐eviceMap columnPrefix="d_")
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot如何獲取application.yml里值的方法
這篇文章主要介紹了springboot如何獲取application.yml里的值,文章圍繞主題相關(guān)自資料展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04Java客戶端服務(wù)端上傳接收文件實(shí)現(xiàn)詳解
這篇文章主要介紹了Java客戶端服務(wù)端上傳接收文件實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)完整案例
遞歸算法的代碼比較簡(jiǎn)潔,可讀性較好;但是在實(shí)際的業(yè)務(wù)處理中會(huì)出現(xiàn)多次的重復(fù)調(diào)用,如果處理不好,很容易出現(xiàn)StackOverflowError報(bào)錯(cuò),這篇文章主要給大家介紹了關(guān)于java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2023-04-04探索Java中的equals()和hashCode()方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了探索Java中的equals()和hashCode()方法的相關(guān)資料,需要的朋友可以參考下2017-05-05劍指Offer之Java算法習(xí)題精講鏈表與數(shù)組專項(xiàng)訓(xùn)練
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03支付寶二面:使用?try-catch?捕獲異常會(huì)影響性能嗎(推薦)
這篇文章主要介紹了支付寶二面:使用?try-catch?捕獲異常會(huì)影響性能嗎,需要注意的是,JVM?中?異常處理的catch語(yǔ)句不再由字節(jié)碼指令來(lái)實(shí)現(xiàn)(很早之前通過(guò)?jsr和?ret指令來(lái)完成,需要的朋友可以參考下2023-03-03MybatisPlus關(guān)聯(lián)查詢的完美實(shí)現(xiàn)方案
我們?cè)陧?xiàng)目開發(fā)的時(shí)候,難免會(huì)遇到連表查詢的操作,所以下面這篇文章主要給大家介紹了關(guān)于MybatisPlus關(guān)聯(lián)查詢的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12