mybatis包含⼀对多的分页查询问题详解
前⼏天同事遇到⼀个问题:ORM框架⽤的mybatisPlus,分页插件也⽤的mybatisPlus⾃带的分页插件,业务是分页查询每页展⽰⼗条数据,但测试环境每页展⽰的条数是随机的,第⼀页⼀条,第⼆页三条。。。,总之很诡异,具体页⾯如下 。看到这个问题感觉还是挺有趣的,但具体代码没有参与开发,也不好去直接帮忙去看,直到他把查询的xml⽂件发到⾥,看了下⽂件这个查询⽤到了⼀对多,⼀下就知道原因了(ps 以前踩过的坑啊,所以印象深刻)。
  很多情况下会遇到列表页需要⼀对多查询,⽐如 查询列表页是展⽰各种⼿机信息,有⼀列是要展⽰这种⼿机所有的内存,⽐如华为
P30有218G,256G,512G,我们先重现下上⾯问题,具体的表结构和实体类如下
                create table TF_L_PHONE
                (
                ID VARCHAR(32) primary key comment 'ID',
                PHONE_BRAND  VARCHAR2(60) comment '⼿机品牌',
                PHONE_NAME VARCHAR2(60) comment '⼿机名称',
                PHONE_CODE VARCHAR2(60) comment '⼿机编码',
                PHONE_DESC VARCHAR2(240) comment '⼿机描述',
                MARKET_TIME TIMESTAMP comment '⼿机上市时间'
                ) comment '⼿机主表';
                create table TF_L_PHONE_RAM
                (
                ID VARCHAR(32) primary key comment 'ID',
                PHONE_ID VARCHAR(32) comment '⼿机id',
                PHONE_RAM number(4) comment '⼿机内存',
                PHONE_FEE number(8) comment '⼿机价格 单位是分'
                ) comment '⼿机内存类型表'; 
  ⼿机主表够构造14条数据,每条⼿机构造了2-3条不等的内存表数据。xml⽂件如下,利⽤swagger做测试,查询第⼀页,每页查5条,返回的结果应该是total为14,返回数据5条,但结果却是total为26,数据3条,我说下问题所在:我们⽤的分页插件就是在我们的sql 外加上具体数据库对应的分页⽅式(oracle⽤ RowNum,mysql ⽤limit),分页查询的时候把每⼀条多侧的数据当成⼀条分页数据,那这样可能查出来的五条都对应同⼀条主表数据,那这时候映射过后就只有⼀条数据。记住是先分页查询后映射数据结构。
打出来的 sql    SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( select t.ID, t.PHON
E_BRAND, t.PHONE_NAME, t.PHONE_CODE, t.PHONE_DESC, t.MARKET_TIME ,PR.id PR_ID,PR.PHONE_ID PR_PHONE_ID,PHONE_RAM,PHONE_FEE
from TF_L_PHONE t left JOIN TF_L_PHONE_RAM PR on t.ID = PR.PHONE_ID ) TMP WHERE ROWNUM <=5) WHERE
ROW_ID > 0
{
"respCode": "0000",
"respDesc": "success",
"data": {
"page": 1,
"rows": 5,
"total": 26,
"totalPages": 6,
"results": [
{
"id": "100",
分页查询插件"phoneBrand": "荣耀",
"phoneName": "荣耀10",
"phoneCode": "RY10",
"phoneDesc": "荣耀10就是好",
"marketTime": "2019-09-05 11:11:51",        "phoneRamList": [
{
"id": "100",
"phoneId": 100,
"phoneRam": 124,
"phoneFee": 199900
},
{
"id": "101",
"phoneId": 100,
"phoneRam": 256,
"phoneFee": 199900
}
]
},
{
"id": "101",
"phoneBrand": "荣耀",
"phoneName": "荣耀20",
"phoneCode": "RY20",
"phoneDesc": "荣耀20就是好",
"marketTime": "2019-09-05 11:11:51",        "phoneRamList": [
{
"id": "110",
"phoneId": 101,
"phoneRam": 124,
"phoneFee": 199900
},
{
"id": "111",
"phoneId": 101,
"phoneRam": 256,
"phoneFee": 199900
}
]
},
{
"id": "104",
"phoneBrand": "华为",
"phoneName": "P20",
"phoneCode": "HWP20",
"phoneDesc": "华为P20就是好",
"marketTime": "2019-09-05 11:11:52",
"phoneRamList": [
{
"id": "125",
"phoneId": 104,
"phoneRam": 256,
"phoneFee": 299900
}
]
}
]
},
"extend": null
  现在我们知道问题的原因了,那我们怎么才能查到正确得⼀对多的分页结果呢,mybatis提供另⼀种⽅式(我理解是⼦查询映射)xml ⽂件和结果如下,问题完美解决。
{
"respCode": "0000",
"respDesc": "success",
"data": {
"page": 1,
"rows": 5,
"total": 14,
"totalPages": 3,
"results": [
{
"id": "100",
"phoneBrand": "荣耀",
"phoneName": "荣耀10",
"phoneCode": "RY10",
"phoneDesc": "荣耀10就是好",
"marketTime": "2019-09-05 11:11:51",        "phoneRamList": [
{
"id": "100",
"phoneId": 100,
"phoneRam": 124,
"phoneFee": 199900
},
{
"id": "101",
"phoneId": 100,
"phoneRam": 256,
"phoneFee": 199900
}
]
},
{
"id": "101",
"phoneBrand": "荣耀",
"phoneName": "荣耀20",
"phoneCode": "RY20",
"phoneDesc": "荣耀20就是好",
"marketTime": "2019-09-05 11:11:51",        "phoneRamList": [
{
"id": "110",
"phoneId": 101,
"phoneRam": 124,

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。