MybatisPlus查询一对多list结果collection实例
前言
查询用户信息,结果放到一个实体类里
这个实体类里有两个List<对象>字段,分别是这个用户的角色列表、岗位列表
以下仅供参考
实体类
package cn.daenx.myadmin.system.vo;
import cn.daenx.myadmin.system.po.SysPosition;
import cn.daenx.myadmin.system.po.SysRole;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.List;
/**
* 用户信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SysUserVo {
private String id;
/**
* 部门ID
*/
private String deptId;
/**
* 部门名称
*/
private String deptName;
/**
* 真实姓名
*/
private String realName;
/**
* 年龄
*/
private String age;
/**
* 性别,0=女,1=男,2=未知
*/
private String sex;
/**
* 个人简介
*/
private String profile;
/**
* 个性签名
*/
private String userSign;
/**
* 头像
*/
private String avatar;
/**
* 账户余额
*/
private Integer money;
/**
* 用户昵称
*/
private String nickName;
/**
* 用户账号
*/
private String username;
/**
* 账号状态,0=正常,1=停用,2=注销
*/
private Integer status;
/**
* 用户手机号
*/
private String phone;
/**
* 邮箱
*/
private String email;
/**
* 微信open_id
*/
private String openId;
/**
* 锁定结束时间
*/
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime banToTime;
/**
* 到期时间,null则永不过期
*/
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime expireToTime;
/**
* 备注
*/
@TableField(value = "remark")
private String remark;
/**
* 用户类型ID
*/
private String userTypeId;
/**
* 用户类型名称
*/
private String userTypeName;
/**
* 创建时间
*/
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
/**
* 修改时间
*/
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updateTime;
/**
* 创建人账号
*/
private String createName;
/**
* 创建人ID
*/
private String createId;
/**
* 修改人账号
*/
private String updateName;
/**
* 修改人ID
*/
private String updateId;
/**
* 用户角色列表
*/
private List<SysRole> roles;
/**
* 用户岗位列表
*/
private List<SysPosition> positions;
/**
* 是否是管理员
*/
private Boolean admin;
}
xml
<select id="getUserInfoByUserId" resultMap="userInfoMap">
SELECT su.id AS id,
su.dept_id AS deptId,
sd.`name` AS deptName,
sud.real_name AS realName,
sud.age AS age,
sud.sex AS sex,
sud.`profile` AS `profile`,
sud.user_sign AS userSign,
sud.avatar AS avatar,
sud.money AS money,
sud.nick_name AS nickName,
su.username AS username,
su.`status` AS `status`,
su.phone AS phone,
su.email AS email,
su.open_id AS openId,
su.ban_to_time AS banToTime,
su.expire_to_time AS expireToTime,
su.remark AS remark,
su.user_type_id AS userTypeId,
sut.`name` AS userTypeName,
su.create_time AS createTime,
su.update_time AS updateTime,
su1.username AS createName,
su.create_id AS createId,
su2.username AS updateName,
su.update_id AS updateId
FROM sys_user su
LEFT JOIN sys_user_detail sud ON sud.user_id = su.id
LEFT JOIN sys_dept sd ON sd.id = su.dept_id
LEFT JOIN sys_user_type sut ON sut.id = su.user_type_id
LEFT JOIN sys_user su1 ON su1.id = su.create_id
LEFT JOIN sys_user su2 ON su2.id = su.update_id
WHERE su.is_delete = 0
<if test="userId != null and userId != ''">
AND su.id = #{userId}
</if>
</select>
<resultMap id="userInfoMap" type="cn.daenx.myadmin.system.vo.SysUserVo">
<result column="id" jdbcType="VARCHAR" property="id"/>
<collection property="roles" column="id" select="queryUserRoles"></collection>
<collection property="positions" column="id" select="queryUserPositions"></collection>
</resultMap>
<select id="queryUserRoles" resultType="cn.daenx.myadmin.system.po.SysRole">
SELECT sr.*
FROM sys_role_user sru
LEFT JOIN sys_role sr ON sru.role_id = sr.id
WHERE sru.user_id = #{id}
</select>
<select id="queryUserPositions" resultType="cn.daenx.myadmin.system.po.SysPosition">
SELECT sp.*
FROM sys_position_user spu
LEFT JOIN sys_position sp ON spu.position_id = sp.id
WHERE spu.user_id = #{id}
</select>
效果

其他方法
百度mprelation
MybatisPlus查询一对多list结果collection实例的更多相关文章
- Mybatis 之级联查询 一对多配置
Mybatis级联 查询相对于hibenate是有点麻烦,但是相应好处也是有的,Mybatis轻量.根据自己要的字段配置方便 一对多配置用 <collection property=&quo ...
- mybatis报错:查询一对多或多对多时只返回一条数据的问题
问题: 使用映射文件实现查询一对多或多对多时只返回一条数据问题 解决方法: 导致这种情况出现的问题是因为两个表中的主键是一样所以出现了数据覆盖问题. 解决方式一:修改数据库表中的主键(这种方法比较麻烦 ...
- linq 实现group by 不使用group关键字 等同lambad表达式中的group join 查询一对多关系
return from orderInfo in orderEntity.x_s_orderInfo join oState in orderEntity.x_s_oStatuInfo on orde ...
- MybatisPlus多表连接查询一对多分页查询数据
一.序言 在日常一线开发过程中,多表连接查询不可或缺,基于MybatisPlus多表连接查询究竟该如何实现,本文将带你找到答案. 在多表连接查询中,既有查询单条记录的情况,又有列表查询,还有分页查询, ...
- Mybatis夺标关联查询一对多实例
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC " ...
- mybatis实战教程二:多对一关联查询(一对多)
多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...
- mybatis ---- 级联查询 一对多 (集合映射)
关联有嵌套查询和嵌套结果两种方式,本文是按照嵌套结果这种方式来说明的 上一章介绍了多对一的关系,用到了<association></association>,这是一个复杂类型的 ...
- 转: Hibernate HQL查询 插入 更新(update)实例
1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hq ...
- mybatis07--关联查询一对多
案例 查询国家的同时,查询出国家下的省会信息! 01.使用单表的连接查询 创建对应的实体类 和数据库表 /** * *国家的实体类 */ public class Country { privat ...
- Mybatis进阶学习笔记——关系查询——一对多查询
一个客户拥有多个订单 <resultMap type="User" id="UserOrderResultMap"> <id column=& ...
随机推荐
- 【Abaqus Case】2D弹塑性接触分析
2D 弹塑性-接触分析 本案例属于材料非线性+边界条件非线性 问题描述 前处理 材料 *Material, name=steel *Density 7.8e-09, *Elastic 210000., ...
- 【ABAQUS文档笔记】实体单元特性&剪切闭锁-沙漏问题-非协调模式-混杂单元
来自ABAQUS DOCUMENT/GETTING STARTED WITH ABAQUS/CAE /USING CONTINUUM ELEMENTS 1. 单元公式和积分 1.1 full inte ...
- 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车.可以坐汽车.可以坐火车.可以坐飞机. 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进 ...
- 【前端动画】—— 再看tweenJS
16开始接触前端,一直对一个问题特别感兴趣,那就是js动画,也就是从那时起开始探究动画的各种表现形式,也是那个时候开始意识到编程这块东西最终考验的就是抽象和逻辑,而这一切完全是数学里边的东西. 最早接 ...
- Nginx可以同时支持ipv4与 ipv6的监听
Nginx可以同时支持ipv4与 ipv6的监听,但为了一致性的考虑,新版本Nginx推荐使用分开监听,下面我们开始进入正题. 一.默认IPV4配置 下面我们先来看一看默认的ipv4配置: 二.加入i ...
- 智能Agent如何改造传统工作流:从搜索到全能助手
智能Agent如何改造传统工作流:从搜索到全能助手 引言:当AI遇上工作流 还记得我们以前搜索信息的方式吗?输入关键词,浏览大量结果,筛选有用内容,再整合成我们需要的答案.这个过程不仅耗时,还常常让人 ...
- 常见的 AI 模型格式
来源:博客链接 过去两年,开源 AI 社区一直在热烈讨论新 AI 模型的开发.每天都有越来越多的模型在 Hugging Face 上发布,并被用于实际应用中.然而,开发者在使用这些模型时面临的一个挑战 ...
- 继承中成员变量和成员方法的访问特点-java se进阶篇 day01
1.继承中成员变量的访问特点 1.成员变量重名 如图 父类中有age变量,子类中也有age变量,这时打印age,出现的是10还是20呢? 答:根据就近原则,出现的是20 2.使用父类成员变量--sup ...
- [SDR] 蓝牙专项教程 —— 从 0 到 1 教小白基于 SDR 编写蓝牙协议栈
目录 前言 一.开题之作 二.动态发送 BLE 广播包 三.基于 PlutoSDR 实现 BLE 广播包的收发一体能力 四.基于 PlutoSDR 的 BLE 广播包的收发实现接入涂鸦智能 APP 教 ...
- argo-cd基于Kubernetes的声明式持续部署
argo-cd基于Kubernetes的声明式持续部署 什么是argo-cd? Argo CD是一个基于Kubernetes的声明式GitOps持续交付工具. 为什么CD ? 应用程序定义.配置和环境 ...