前言

最近在做一个需求,简单来讲就是有两个表,一个公司表,一个公司类型表,一个公司有多个类型,这是一对多的关系,需要连接查询处理。但在用了公司框架分页的时候,会把整个连接查询结果作为总条数返回,导致分页不对。

思路:后来使用子查询解决了这个问题,也就是在主表查询中,只查询主表的字段,在子查询中再查询连表的字段。最后对主表去重一下,查出来的结果再分页就没有问题了。

一、表结构

image-20210807164326452

一对多的关系,这里举了最简单的例子,公司表company只有主键id和公司中文名cn_name。公司类型表有主键id,公司id,和类型名称。

这里测试,一个公司对应两个公司类型,如果直接通过连接查询,结果如下:

image-20210807165048140

二、预期效果

这样查出来的总行数是4,如果直接分页,那肯定是不对的,因为我们想要的返回结果如下:

image-20210807170144747

只有两条记录,公司的类型表中只返回类型名称,用数组形式返回。

三、返回响应体

返回响应体的类如下:

image-20210807170514909

List<String> compTypes返回公司类型的数据。

mybatis子查询如下:

1
<select id="selectTypes" resultType="string">
2
       SELECT type from company_type where company_id = #{companyId}
3
   </select>
4
5
   <resultMap id="queryCompanyMap" type="com.study.mybatis.resp.CompanyResp">
6
       <result column="id" property="id" />
7
       <result column="cn_name" property="cnName" />
8
       <collection property="compTypes"
9
                   ofType="list"
10
                   column="{companyId=id}"
11
                   select="selectTypes"
12
                   javaType="java.util.ArrayList" />
13
   </resultMap>
14
15
   <select id="queryCompanyByPage" resultMap="queryCompanyMap">
16
       SELECT distinct t1.id,t1.cn_name
17
       FROM company t1
18
       LEFT JOIN company_type t2
19
       on t1."id" = t2.company_id
20
   </select>

条件查询等可以在queryCompanyByPage中做,用collection来表示一对多。

四、小结

关键在于不要在主查询中把连表的字段查出来,而是在一对多的<collection>中再查连表字段。