iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >mybatis 实现多层级collection嵌套
  • 202
分享到

mybatis 实现多层级collection嵌套

2024-04-02 19:04:59 202人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录mybatis多层级collection嵌套JSON结构第一步查询第二步查询第三步查询(第三层查询)最后附实体截图,其实看json就可以了方式二(推荐)mybatis多层(三层)

mybatis多层级collection嵌套

json结构

第一步查询

第一层查询,将第一层的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就可以了

第一层实体:

第二层实体:

第三层实体:

方式二(推荐)

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


@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;
 
}

@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;
}

@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_")

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: mybatis 实现多层级collection嵌套

本文链接: https://www.lsjlt.com/news/142112.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mybatis 实现多层级collection嵌套
    目录mybatis多层级collection嵌套json结构第一步查询第二步查询第三步查询(第三层查询)最后附实体截图,其实看json就可以了方式二(推荐)mybatis多层(三层)...
    99+
    2022-11-13
  • Mybatis的collection三层嵌套查询怎么写
    这篇“Mybatis的collection三层嵌套查询怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Mybatis的c...
    99+
    2023-07-05
  • mybatis使用collection嵌套查询的实现
    在开发中,可能会遇到一对多的关系,这个时候,一条sql语句就难以胜任这个任务了。只能先执行一条sql,然后根据返回的结果,再做一次sql关联查询,这个时候,使用mybatis的col...
    99+
    2022-11-13
  • Mybatis的collection三层嵌套查询方式(验证通过)
    目录Mybatis collection三层嵌套查询一般情况下,我们都是两层的嵌套找到一个方案实体类的映射关系SQL映射关系如下解析如下总结Mybatis collection三层嵌...
    99+
    2023-03-15
    Mybatis collection collection三层嵌套查询 collection嵌套查询
  • Java之Mybatis多层嵌套查询方式
    目录Mybatis多层嵌套查询表的存储sql文件实体类XMLMybatis多层嵌套查询(多对多)依赖实体类Setmeal实体类CheckGroup实体类CheckItemmapper...
    99+
    2022-11-13
  • python实现字典多层嵌套
    对于字典:dict1={"a":1, "b":2, "c.1":3, "c.2":4, "d.5.2":5, "d.5.3":6, "d.4.1":7}, 将其实现多层嵌套为:dict2={'a': 1, 'b': 2, 'c'...
    99+
    2023-01-31
    嵌套 多层 字典
  • 在Mybatis中association标签多层嵌套的问题
    目录association标签多层嵌套问题排查从代码上看没有什么问题正常代码如下association集合嵌套这个返回集合有什么用呢association标签多层嵌套问题 mybat...
    99+
    2022-11-13
  • Mybatis中association标签多层嵌套问题怎么解决
    这篇“Mybatis中association标签多层嵌套问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Mybat...
    99+
    2023-06-29
  • mybatis一对多嵌套查询怎么实现
    本文小编为大家详细介绍“mybatis一对多嵌套查询怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatis一对多嵌套查询怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。mybatis一对多嵌...
    99+
    2023-07-05
  • element table多层嵌套显示的实践
    有个需求是一个列表,里面包含多个单子,每个单子可以是唯一,也可以是多个合并之后的,而且每个单子下面显示的是另外一个表格,来上图  每行的操作还不一样,然后通过官网的一些例...
    99+
    2022-11-12
  • Vue实现多层组件嵌套的方法有哪些
    小编给大家分享一下Vue实现多层组件嵌套的方法有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!实例如下:<!DOCTYPE html> <html> ...
    99+
    2022-10-19
  • vue+element表格实现多层数据的嵌套方式
    目录vue+element表格实现多层数据嵌套这是完成之后的方法  vue+element表格实现多层数据嵌套 今天用element的表格渲染了商城的购物车列表,...
    99+
    2022-11-13
  • 微信小程序自定义tab实现多层tab嵌套
    本文实例为大家分享了微信小程序自定义tab实现多层tab嵌套的具体代码,供大家参考,具体内容如下 仅供参考,刚学,不对的地方希望交流学习 HTML: <template>...
    99+
    2022-11-13
  • vue使用vuedraggable实现嵌套多层拖拽排序功能
    本文实例为大家分享了vuedraggable实现嵌套多层拖拽排序功能的具体代码,供大家参考,具体内容如下 vue中实现嵌套多层拖拽功能。官网入口: 实现效果:(拖动左侧调整一级的顺序...
    99+
    2022-11-13
  • vue实现table表格里面数组多层嵌套取值
    目录vue table表格里面数组多层嵌套取值表格部分methods里面定义方法vue 多层数组嵌套循环,动态取值匹配vue table表格里面数组多层嵌套取值 我现在是在表格里拿到...
    99+
    2022-11-13
    vue table表格 数组多层嵌套取值 vue数组多层嵌套
  • mybatis-plus之如何实现in嵌套sql
    目录mybatis-plus实现in嵌套sqlmybatis-plus sql中in的用法总结mybatis-plus实现in嵌套sql 今天使用jeegboot看源码时发现用户权限...
    99+
    2023-03-15
    mybatis-plus in mybatis-plus in嵌套sql mybatis-plus嵌套
  • Vue3嵌套路由中使用keep-alive缓存多层的实现
    目录前言Demo项目结构路由层级扁平化给所有的 router-view 都嵌套上 keep-alive前言 keep-alive是Vue中的缓存标签, 组件在标签中的内容会被缓存下来...
    99+
    2023-05-16
    Vue3 keep-alive缓存多层 Vue3 缓存多层
  • CSS怎么实现多层嵌套结构最外层旋转其它层不旋转效果
    这篇文章主要介绍CSS怎么实现多层嵌套结构最外层旋转其它层不旋转效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!有这样一个场景:一个圆形容器,最外层容器的背景为圆弧,现在要将最外层的圆弧进行旋转,保证里面的容器里面...
    99+
    2023-06-08
  • 微信小程序怎么自定义tab实现多层tab嵌套
    这篇“微信小程序怎么自定义tab实现多层tab嵌套”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序怎么自定义tab实...
    99+
    2023-07-02
  • mybatis collection 多条件查询的实现方法
    mybatis collection 多条件查询的实现方法 前言: 业务需要通过mybatis 查询返回嵌套集合,嫌多次查询太麻烦,用自带的高级查询解决问题,下边是代码,已测试通过。 说下自己的理解,就是一...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作