mybatis 实现多层级collection嵌套
作者:缥缈神 发布时间:2022-07-19 21:33:18
标签:mybatis,多层级,collection,嵌套
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 实体描述
/**
* <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


猜你喜欢
- 由于Android对单个应用所施加的内存限制,比如16MB,这导致加载Bitmap的时候很容易出现内存溢出,本文主要包含2个方面的内容分析B
- 在IDEA中配置log4j,步骤很简单1.在Maven中加入以下配置<dependency> <groupI
- 高斯模糊高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像
- 在Android中使用SQLite数据库的入门指南,打算分下面几部分与大家一起分享, 1、什么是SQLite 2、Android中使用SQL
- 来看一个具体的习题实践:题目根据二叉树前序遍历序列例如:7,-7,8,#,#,-3,6,#,9,#,#,#,-5,#,#,构建二叉树,并且用
- Selenium IDE 是Firefox 浏览器的一个插件, 它会记录你对Firefox的操作,并且可以回放它的操作。 用法简单,不过我觉
- 本文实例讲述了C#移除所有事件绑定的方法。分享给大家供大家参考。具体分析如下:private delegate int DEL_TEST_E
- 问题现象前段时间升级 Android Studio 3.1.3+ 版本后,决定尝试使用 Kotlin 做 APP 开发看看。结果却发现,修改
- 概览这部分内容来自于这个类的注释,简单翻译了下。LockSupport 类是用于创建锁和其他同步类的基本线程阻塞原语。它的实现思想
- 看看效果图:我们项目中头像显示一般都是圆形的,但是有时候不排除各种样式(不一定是个规则的形状),比如 上次UI给了我一个 圆形下面少了一块。
- 基本介绍BottomSheetDialog是底部操作控件,可在屏幕底部创建一个支持滑动关闭视图。目前依赖使用如下:implementatio
- 前言消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分
- sqlite是啥?1、一种轻型数据库2、关系型数据库3、占用资源很低,几百K内存,适合嵌入式设备4、支持windows、linux、unix
- 使用spring框架实现数据库事务处理事务对于数据库来说是,是对sql语句的一系列操作,这些操作被组织成为一个事务。事务具有原子性的,要么全
- 这篇文章主要介绍了Java CPU性能分析工具代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- @EventListener 异步中使用condition的问题@EventListener是spring在4.2+推出的更好的使用spri
- 介绍在本文中,我们将了解如何将现有应用程序迁移到Spring 6以及如何充分利用此升级。本文中的提示基于我在Hypersistence Op
- 最近一直想写一个类似于待办的东西,由于不想用传统的session,就卡住了,后来在各种群里扯皮,发现除了用缓存之外,还可以通过 JWT 来实
- 每种编程语言都有自己操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过“引用”。在 JDK.1.2 之后
- .NET包含一个特殊的Object类,可以接受任意的数据类型的值,当所传递或所赋值的类型不是一个特定的数据类型时,object类就提供了一种