mybatis 实现多层级collection嵌套

作者:缥缈神 时间:2022-07-19 21:33:18 

mybatis多层级collection嵌套

json结构

mybatis 实现多层级collection嵌套

第一步查询

第一层查询,将第一层的id传递到第二层当条件查询    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传递到第三层当条件查询    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>

其实蛮好理解的,就是查询一个,然后把条件传递下步继续查询。。。 使用时调第一层,也就是从高到底。

最后附实体截图,其实看json就可以了

第一层实体:

mybatis 实现多层级collection嵌套

第二层实体:

mybatis 实现多层级collection嵌套

第三层实体:

mybatis 实现多层级collection嵌套

方式二(推荐)

<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 实体描述

/**
* <p>
* 家庭表
* </p>
*
* @author lohas
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("t_family_info")
@ApiModel(value = "FamilyInfoEntity对象", 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 = "国家")
   private String country;

@ApiModelProperty(value = "城市")
   private String city;

@ApiModelProperty(value = "地址")
   private String address;

@ApiModelProperty(value = "经度")
   private BigDecimal longitude;

@ApiModelProperty(value = "纬度")
   private BigDecimal latitude;

@ApiModelProperty(value = "租户ID")
   private String tenantId;

@ApiModelProperty(value = "是否删除(0:正常;低于0的数字:已删除)")
   private String deleteFlag;

@ApiModelProperty(value = "创建人ID")
   private String creatorId;

@ApiModelProperty(value = "创建时间")
   @JsonDeserialize(using = LocalDateTimeSerializerConfig.LocalDateTimeDeserializer.class)
   @JsonSerialize(using = LocalDateTimeSerializerConfig.LocalDateTimeSerializer.class)
   private LocalDateTime createTime;

@ApiModelProperty(value = "更新人ID")
   private String updateId;

@ApiModelProperty(value = "更新时间")
   @JsonDeserialize(using = LocalDateTimeSerializerConfig.LocalDateTimeDeserializer.class)
   @JsonSerialize(using = LocalDateTimeSerializerConfig.LocalDateTimeSerializer.class)
   private LocalDateTime updateTime;

}
/**
* @author lohas
* @description
*/
@Data
@ApiModel(value = "RoomDeviceInfoVo对象", description = "房间设备信息实体")
public class RoomDeviceInfoVo implements Serializable {

@ApiModelProperty(value = "房间id")
   private String roomId;

@ApiModelProperty(value = "房间名称")
   private String roomName;

@ApiModelProperty(value = "设备数量")
   private Integer deviceNum;

@ApiModelProperty(value = "设备信息列表")
   private List<String> deviceIds;
}
/**
* @author lohas
* @description
*/
@Data
@ApiModel(value = "FamilyRoomInfoVo对象", description = "家庭房间信息对象实例")
public class FamilyRoomInfoVo extends FamilyInfoEntity {

@ApiModelProperty(value = "房间设备信息列表")
   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因为columnPrefix="r_"(如果字段唯一,可以不加)
                   trf.room_name AS r_room_name, --要加上r因为columnPrefix="r_"
                   trd.device_id AS r_d_device_id --要加上r因为columnPrefix="r_",加上d因为columnPrefix="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因为columnPrefix="r_"
                   COUNT(trd.device_id) AS r_device_num  --要加上r因为columnPrefix="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">
<!-- 三层: 设备信息-->
<result column="device_id" jdbcType="VARCHAR"/>
</resultMap>

</mapper>

调用方法

public interface FamilyInfoMapper extends BaseMapper<FamilyInfoEntity> { 
    List<FamilyRoomInfoVo> getFamilyRoomInfoVoByUserId(@Param("userId") String userId);   
}

注意总结

如果你的字段唯一,columnPrefix="r_" 和 columnPrefix="d_",可以不加,如果你加上了columnPrefix记得在字段上拼接上,否则查询不出数据,拼接要有前后顺序拼接例如:

<collection property="roomDeviceInfoVoList" columnPrefix="r_" resultMap="roomMap"/>
<collection property="deviceIds" columnPrefix="d_" resultMap="deviceMap"/>
r_d_device_id(要加上r因为roomMap columnPrefix="r_",加上d因为deviceMap columnPrefix="d_")

来源:https://blog.csdn.net/piaomiaozaitianya/article/details/108000086

标签:mybatis,多层级,collection,嵌套
0
投稿

猜你喜欢

  • Java实现简单员工管理系统

    2021-12-13 17:51:26
  • C#使用iTextSharp添加PDF水印

    2021-10-09 08:59:27
  • SpringBoot项目中使用Mockito的示例代码

    2023-09-25 22:31:14
  • c#使用正则表达式匹配字符串验证URL示例

    2023-01-01 10:40:10
  • IDEA使用SequenceDiagram插件绘制时序图的方法

    2023-07-03 11:20:07
  • 解决jasperreport导出的pdf每页显示的记录太少问题

    2023-04-14 13:02:01
  • Java Shutdown Hook场景使用及源码分析

    2023-05-19 06:01:30
  • C#子线程更新UI控件的方法实例总结

    2022-08-31 15:40:23
  • Java编程实现基于TCP协议的Socket聊天室示例

    2023-02-17 17:23:13
  • 教你用JAVA写文本编辑器(一)

    2023-06-13 09:05:31
  • SpringMVC Restful api接口实现的代码

    2023-11-29 12:34:27
  • 利用C#9.0新语法如何提升if语句美感

    2021-06-15 12:48:54
  • c# Selenium爬取数据时防止webdriver封爬虫的方法

    2023-06-24 07:50:51
  • C语言代码实现三子棋小游戏

    2023-04-16 02:12:41
  • 详解三种C#实现数组反转方式

    2023-10-09 20:29:23
  • C#中POST接口formdata传参模板的记录

    2022-03-30 01:58:50
  • Android自定义控件案例汇总1(菜单、popupwindow、viewpager)

    2021-11-22 14:37:32
  • Spring Cloud + Nacos + Seata整合过程(分布式事务解决方案)

    2021-08-31 04:26:52
  • 新闻列表的分页查询java代码实现

    2022-02-24 19:46:25
  • Android四大组件之Activity详解

    2022-08-22 00:00:49
  • asp之家 软件编程 m.aspxhome.com