MyBatisPlus一对多分页查询处理主表子表查询条件
业务上遇到了一个问题,需要进行一对多的分页查询,同时还存在对主表和子表的条件限制,经过查询后参考其他人的经验进行了处理,记录如下.
其中的坑就是正常的分页查询下,一对多的分页是错误的,它不会按主表的查询条数来返回数量,而是把主表-一个子表记录这样的形式来返回数量,导致返回数量跟预期不符.例如一个MiddleWareDto对象里nodes大小为5,应该返回数量是1,结果它会返回5.
这里使用子查询的方式来避免这个坑.
各实体类如下
public class MiddleWareDto implements Serializable {//主表的idprivate Integer groupId;....................//其他属性....................private List<MiddleWareNodeDto> nodes;}
public class MiddleWareNodeDto {//对应主表中的groupIdprivate Integer groupId;......................//其他属性
}
Service
@Overridepublic CommResponse<PageResult<MiddleWareDto>> list(MiddleWareReq req) {Page<MiddleWareDto> page = new Page<>(req.getPageIndex(), req.getPageSize());IPage<MiddleWareDto> list = middleWareGroupMapper.getList(page, req);.......................}
Mapper
mapper方法声明如下,包括主查询和子查询方法,Service中调用的是主查询方法
IPage<MiddleWareDto> getList(@Param("page") Page<MiddleWareDto> page, @Param("req") MiddleWareReq req);List<MiddleWareNodeDto> getNodeList(Integer groupId);
xml文件编写
主查询如下:
<select id="getList" resultMap="MiddleWareDtoResultMap">SELECT * FROM MIDDLE_WARE_GROUP wWHERE 1=1<if test="req.groupName != null and req.groupName != ''">AND w.group_name like '%'+#{req.groupName}+'%'</if><if test="req.type != null and req.type != ''">ANd w.type=#{req.type}</if><if test="req.hostId != null and req.hostId > 0">AND w.group_id IN (SELECT a.group_id FROM MIDDLE_WARE_GROUP a,MIDDLE_WARE_NODE b WHERE a.group_id = b.group_id AND b.host_id=#{req.hostId})</if><if test="req.ip !=null and req.ip != ''">AND w.group_id IN (SELECT a.group_id FROM MIDDLE_WARE_GROUP a,MIDDLE_WARE_NODE b WHERE a.group_id = b.group_id AND b.ip_port LIKE '%'+#{req.ip}+'%')</if></select>
可以看到主查询主要是查询的主表,查询结果通过resultMap进行了映射,就是在这里调用进行子查询.
这里前两个查询条件是对主表的限制,直接写即可;后两个条件是对子表的限制,没法直接实现,只能通过这种间接的形式来实现.
我们看一下resultMap的具体内容:
<resultMap id="MiddleWareDtoResultMap" type="com.montnets.monitor.pcweb.entity.dto.MiddleWareDto"><id property="groupId" column="group_id"/><result property="groupName" column="group_name"/>.......其他属性的映射<collection property="nodes" ofType="com.montnets.monitor.pcweb.entity.dto.MiddleWareNodeDto"select="getNodeList" column="group_id" javaType="ArrayList"><result property="groupId" column="group_id"/>......其他属性映射</collection></resultMap>
这里面 collection 指的就是一对多的实现,
property 指主对象中的属性,即我们的list
ofType 指list中的类型
select 子查询语句
column 子查询的参数
javaType 子查询集合的类型,即我们的nodes的类型
最后看看我们的子查询语句
<select id="getNodeList" resultType="com.montnets.monitor.pcweb.entity.dto.MiddleWareNodeDto">SELECT * FROM MIDDLE_WARE_NODE nWHERE n.group_id = #{groupId}</select>
总结一下:通过resutlMap映射的方式调用子查询,实现一对多的查询,使用自带的page分页实现,使用了间接的限制方式实现了对子表查询条件的查询
MyBatisPlus一对多分页查询处理主表子表查询条件相关推荐
- 关于主外键关系主表子表插入 或者更新
主外键关系表主表子表插入或者更新问题 对于多表的整体跟新数据,并且各个表之间有主外键关联 表UserA为主表,主键为id; 表UserB为主表,主键为Bid,外键为id: 表UserC为主表,主键为C ...
- server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...
4.1.查询的类型 declare @value as int set @value = 50 select 'age:'as age,2008 years,@valueas va --这种查询时跟 ...
- case when 子查询_Oracle数据库-单表查询
本章涉及单张表中的查询语句,包含常用的条件查询.范围查询.模糊查询等,跨表查询后续将会介绍. 1.基本查询语句 格式:SELECT[DISTINCT] column_name,-|* FROM tab ...
- 笔记:3.4 《数据库系统概论》之数据查询---SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)
对 3.2 数据查询-SELECT(单表查询.连接查询.嵌套查询.集合查询.多表查询)的转载与学习笔记: 0.前言 本篇文章是对<数据库系统概论>王珊老师主编的数据库查询SELECT部分做 ...
- mysql数据库操作多表查询_MySQL数据库查询操作进阶——多表查询
多表查询 在大部分情况下,我们用到的表都是彼此相关联的,所以我们会有相当大的需求用到跨表的查询,这个时候我们就需要将相关联的表连起来做多表查询. 多表查询分为连表查询和子查询,连表查询即将相关联的表连 ...
- mysql怎样查表的模式_mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】...
1.mysql简单的查询:select 字段1,字段2... from tablename; 如果字段那里写一个*,代表查询所有的字段,等同于指定出所有的字段名,因此如果要查询所有字段的数据,一般都是 ...
- mysql单表查询实例_MySQL简单查询详解-单表查询
MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...
- MySQL讲义第 33 讲——select 查询之静态交叉表查询
MySQL讲义第 33 讲--select 查询之静态交叉表查询 文章目录 MySQL讲义第 33 讲--select 查询之静态交叉表查询 一.数据准备 二.交叉表的形式 三.静态交叉表的实现 1. ...
- 将联表查询简化为单表查询案例
目录 1.将联表查询简化为单表查询案例 1.1 问题描述 1.2 优化过程 1.2.1 将联表查询修改为单表查询 1.2.2 利用覆盖索引避免回表 1.将联表查询简化为单表查询案例 1.1 问题描述 ...
最新文章
- QTableView中使用Delegate方式来实现对特定列的文本进行换行
- 如何在AngularJS中使用ng-repeat迭代键和值?
- 工作146:webstorm持续updating indices解决方法
- Netty工作笔记0059---Netty私聊实现思路
- Python21天打卡Day15-21 函数+参数
- Sass学习之路(2)——Sass环境安装(windows版)
- MediaChooser图库浏览器
- python长沙_python 长沙
- 如何使用雅虎相册在陶宝网增加宝贝描述图片(转)
- 信息系统项目管理师考试重点和难点分析
- 老中医化妆品效果怎么样?舒缓系列拒绝敏感肌肤困扰
- 小学计算机室培训心得,小学计算机培训心得体会范文
- WinSCP(版本5.7.6)中文文件名显示乱码
- unity 2D动画控制一些小技巧
- adb 安卓模拟器 进程端口_Android模拟器端口被占用问题的解决办法
- OK6410A 开发板 (三) 3 u-boot-2021.01 boot 解析概览
- [待续]联想ThinkPadE420升级之路:英睿达(Crucial)MX500+XP开启AHCI模式+64位win10
- java实现手机扫二维码登陆
- 国家自然科学基金 计算机视觉,国家自然科学基金重大项目“合成孔径雷达微波视觉三维成像理论与应用基础研究”启动...
- 2021-08-08 WPF控件专题 ListBox控件详解