业务上遇到了一个问题,需要进行一对多的分页查询,同时还存在对主表和子表的条件限制,经过查询后参考其他人的经验进行了处理,记录如下.

其中的坑就是正常的分页查询下,一对多的分页是错误的,它不会按主表的查询条数来返回数量,而是把主表-一个子表记录这样的形式来返回数量,导致返回数量跟预期不符.例如一个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一对多分页查询处理主表子表查询条件相关推荐

  1. 关于主外键关系主表子表插入 或者更新

    主外键关系表主表子表插入或者更新问题 对于多表的整体跟新数据,并且各个表之间有主外键关联 表UserA为主表,主键为id; 表UserB为主表,主键为Bid,外键为id: 表UserC为主表,主键为C ...

  2. server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...

    4.1.查询的类型 declare @value as int set @value = 50 select  'age:'as age,2008 years,@valueas va --这种查询时跟 ...

  3. case when 子查询_Oracle数据库-单表查询

    本章涉及单张表中的查询语句,包含常用的条件查询.范围查询.模糊查询等,跨表查询后续将会介绍. 1.基本查询语句 格式:SELECT[DISTINCT] column_name,-|* FROM tab ...

  4. 笔记:3.4 《数据库系统概论》之数据查询---SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)

    对 3.2 数据查询-SELECT(单表查询.连接查询.嵌套查询.集合查询.多表查询)的转载与学习笔记: 0.前言 本篇文章是对<数据库系统概论>王珊老师主编的数据库查询SELECT部分做 ...

  5. mysql数据库操作多表查询_MySQL数据库查询操作进阶——多表查询

    多表查询 在大部分情况下,我们用到的表都是彼此相关联的,所以我们会有相当大的需求用到跨表的查询,这个时候我们就需要将相关联的表连起来做多表查询. 多表查询分为连表查询和子查询,连表查询即将相关联的表连 ...

  6. mysql怎样查表的模式_mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】...

    1.mysql简单的查询:select 字段1,字段2... from tablename; 如果字段那里写一个*,代表查询所有的字段,等同于指定出所有的字段名,因此如果要查询所有字段的数据,一般都是 ...

  7. mysql单表查询实例_MySQL简单查询详解-单表查询

    MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...

  8. MySQL讲义第 33 讲——select 查询之静态交叉表查询

    MySQL讲义第 33 讲--select 查询之静态交叉表查询 文章目录 MySQL讲义第 33 讲--select 查询之静态交叉表查询 一.数据准备 二.交叉表的形式 三.静态交叉表的实现 1. ...

  9. 将联表查询简化为单表查询案例

    目录 1.将联表查询简化为单表查询案例 1.1 问题描述 1.2 优化过程 1.2.1 将联表查询修改为单表查询 1.2.2 利用覆盖索引避免回表 1.将联表查询简化为单表查询案例 1.1 问题描述 ...

最新文章

  1. QTableView中使用Delegate方式来实现对特定列的文本进行换行
  2. 如何在AngularJS中使用ng-repeat迭代键和值?
  3. 工作146:webstorm持续updating indices解决方法
  4. Netty工作笔记0059---Netty私聊实现思路
  5. Python21天打卡Day15-21 函数+参数
  6. Sass学习之路(2)——Sass环境安装(windows版)
  7. MediaChooser图库浏览器
  8. python长沙_python 长沙
  9. 如何使用雅虎相册在陶宝网增加宝贝描述图片(转)
  10. 信息系统项目管理师考试重点和难点分析
  11. 老中医化妆品效果怎么样?舒缓系列拒绝敏感肌肤困扰
  12. 小学计算机室培训心得,小学计算机培训心得体会范文
  13. WinSCP(版本5.7.6)中文文件名显示乱码
  14. unity 2D动画控制一些小技巧
  15. adb 安卓模拟器 进程端口_Android模拟器端口被占用问题的解决办法
  16. OK6410A 开发板 (三) 3 u-boot-2021.01 boot 解析概览
  17. [待续]联想ThinkPadE420升级之路:英睿达(Crucial)MX500+XP开启AHCI模式+64位win10
  18. java实现手机扫二维码登陆
  19. 国家自然科学基金 计算机视觉,国家自然科学基金重大项目“合成孔径雷达微波视觉三维成像理论与应用基础研究”启动...
  20. 2021-08-08 WPF控件专题 ListBox控件详解

热门文章

  1. Java中的String为什么是不可变的? -- String源码分析
  2. 会计未来十年发展趋势_会计行业未来10年将变成什么样(最适合会计转行的行业)...
  3. hdu3031 N Knight
  4. 重新定义备份:鼎甲科技发布DBackup6.0备份容灾管理系统
  5. 今天,影响了一位试用期员工的去留
  6. 安全HCIP之IPX
  7. 《数据安全法》第二十一条【数据分类分级保护】 解读与合规实践探究
  8. 计算机课对分课堂,对分课堂是干什么的
  9. 2020考研六月份计划
  10. ArcGIS Engine10.2 VS2012 环境搭建。