Mybatis一对多分页问题,采用子查询
前言
最近在做一个需求,简单来讲就是有两个表,一个公司表,一个公司类型表,一个公司有多个类型,这是一对多的关系,需要连接查询处理。但在用了公司框架分页的时候,会把整个连接查询结果作为总条数返回,导致分页不对。
**思路:**后来使用子查询解决了这个问题,也就是在主表查询中,只查询主表的字段,在子查询中再查询连表的字段。最后对主表去重一下,查出来的结果再分页就没有问题了。
一、表结构
一对多的关系,这里举了最简单的例子,公司表company
只有主键id和公司中文名cn_name。公司类型表有主键id,公司id,和类型名称。
这里测试,一个公司对应两个公司类型,如果直接通过连接查询,结果如下:
二、预期效果
这样查出来的总行数是4,如果直接分页,那肯定是不对的,因为我们想要的返回结果如下:
只有两条记录,公司的类型表中只返回类型名称,用数组形式返回。
三、返回响应体
返回响应体的类如下:
用List<String> compTypes
返回公司类型的数据。
mybatis子查询如下:
<select id="selectTypes" resultType="string">SELECT type from company_type where company_id = #{companyId}</select><resultMap id="queryCompanyMap" type="com.study.mybatis.resp.CompanyResp"><result column="id" property="id" /><result column="cn_name" property="cnName" /><collection property="compTypes"ofType="list"column="{companyId=id}"select="selectTypes"javaType="java.util.ArrayList" /></resultMap><select id="queryCompanyByPage" resultMap="queryCompanyMap">SELECT distinct t1.id,t1.cn_nameFROM company t1LEFT JOIN company_type t2on t1."id" = t2.company_id</select>
条件查询等可以在queryCompanyByPage
中做,用collection
来表示一对多。
四、小结
关键在于不要在主查询中把连表的字段查出来,而是在一对多的<collection>
中再查连表字段。
Mybatis一对多分页问题,采用子查询相关推荐
- mybatis 一对多关系映射 select子查询 只有一条数据 解决方案
一般一对多 多的那个会是联合主键 所以要这么设置 <resultMap id="CfdMap" type="com.sxq.cloud.entity.ZhyyB2C ...
- Oracle分页为什么采用三层查询
Oracle分页为什么采用三层查询 原始表数据如下 ID NAME AGE ADDRESS 1 嗨一 18 北京 2 王二 20 南京 3 麻子 22 西凉 4 太君 24 东京 5 华子 26 纽约 ...
- Mybatis一对多分页查询问题
一.背景引入 Mybatis提供了处理结果集的标签,其中子标签collection可以处理1对多的映射 <resultMap><collection></collecti ...
- PageHelper在对mybatis一对多分页不正确的问题
1. 其实这个问题仔细一想也没什么 1.首先使用PageHelper单表没有问题 2.连表查询不牵扯到一对多也没有问题 3.连表查询牵扯到一对多分页错误: 比如:查第一页,查询10条数据,却只得到三条 ...
- Mybatis一对多,多对一嵌套查询的返回
我们有时候查询需要一带多,多带一的信息,举个一对多的例子:我们要查询所有的订单,顺便还能把对应的订单里面的多条详情(比如对应的商品,商品价格等)也带出来. 类似于这样 orderNo, orderTi ...
- Mybatis一对多及多对多映射查询
1.数据库准备工作 --删除表 drop table SelectiveInfo; drop table StudentInfo; drop table ClassInfo; drop table T ...
- mybatis一对多关联查询两种方式
mybatis一对多关联查询两种方式 前提: 方式一: 方式二: 前提: 现在有两张表,学生表跟教师表,一个教师对应多个学生 教师表: CREATE TABLE `teacher` (`id` int ...
- mybatis 一对多 两种查询方式
注意事项: 如果是多表 例如有A表,B表 A是多端,B是一端 那么就要在B端声明A端的集合 必须 上代码: 我使用的是java语言,先看实体类 这是单表的一对多 多表跟单表逻辑是一致 public ...
- sharding子查询_ShardingSphere 分页
分页性能 性能瓶颈 查询偏移量过大的分页会导致数据库获取数据性能低下,以MySQL为例: SELECT * FROM t_order ORDER BY id LIMIT 1000000, 10 这句S ...
最新文章
- Ubuntu apt-get install、apt-get -f install、apt-get --purge remove、apt-get update、apt-get upgrade、
- MySQL 代码结构与基本流程
- 曝贾扬清第二跳,加入阿里!达摩院或将承载中国下一个AI愿景?
- PacificA 一致性协议解读
- 使用Memcached实现Session共享
- 2016年IoT和新的逃逸技术将会引领威胁态势
- 盘点大型分布式网站术语
- Dapr + .NET 实战(十-终篇)K8S运行Dapr
- Java的Gradle依赖关系,使用编译还是实现?
- bzoj1699[Usaco2007 Jan]Balanced Lineup排队
- realme Pad通过认证:搭载7100mAh大容量电池
- 是时候拥有一个你自己的命令行工具了
- JQuery 1.8.3对IE9兼容问题getAttribute
- 编译安装nginx并修改版本头信息—参考实例
- 电驴(easyMule)自动关机工具
- 《算法分析与设计(第5版)》——王晓东 - 学习记录 / 期末复习
- php 条件求和,Excel条件求和公式是什么
- 统计分析/PCA,PCoA,NMDS等的区别
- NCCL下载及安装教程
- 字节健康摸着百度过河