前幾天同事遇到一個問題:ORM框架用的mybatisPlus,分頁插件也用的mybatisPlus自帶的分頁插件,業務是分頁查詢每頁展現十條數據,但測試環境每頁展現的條數是隨機的,第一頁一條,第二頁三條。。。,總之很詭異,具體頁面以下 。看到這個問題感受仍是挺有趣的,但具體代碼沒有參與開發,也很差去直接幫忙去看,直到他把查詢的xml文件發到羣裏,看了下文件這個查詢用到了一對多,一下就知道緣由了(ps 之前踩過的坑啊,因此印象深入)。mysql
不少狀況下會遇到列表頁須要一對多查詢,好比 查詢列表頁是展現各類手機信息,有一列是要展現這種手機全部的內存,好比華爲P30有218G,256G,512G,咱們先重現下上面問題,具體的表結構和實體類以下sql
create table TF_L_PHONE數據庫
(數據結構
ID VARCHAR(32) primary key comment 'ID',mybatis
PHONE_BRAND VARCHAR2(60) comment '手機品牌',oracle
PHONE_NAME VARCHAR2(60) comment '手機名稱',框架
PHONE_CODE VARCHAR2(60) comment '手機編碼',測試
PHONE_DESC VARCHAR2(240) comment '手機描述',編碼
MARKET_TIME TIMESTAMP comment '手機上市時間'spa
) 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.PHONE_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, "phoneFee": 199900 }, { "id": "111", "phoneId": 101, "phoneRam": 256, "phoneFee": 199900 } ] }, { "id": "102", "phoneBrand": "榮耀", "phoneName": "榮耀9", "phoneCode": "RY9", "phoneDesc": "榮耀9就是好", "marketTime": "2019-09-05 11:11:52", "phoneRamList": [ { "id": "120", "phoneId": 102, "phoneRam": 124, "phoneFee": 199900 }, { "id": "121", "phoneId": 102, "phoneRam": 256, "phoneFee": 299900 } ] }, { "id": "103", "phoneBrand": "華爲", "phoneName": "P30", "phoneCode": "HWP30", "phoneDesc": "華爲P30就是好", "marketTime": "2019-09-05 11:11:52", "phoneRamList": [ { "id": "122", "phoneId": 103, "phoneRam": 124, "phoneFee": 199900 }, { "id": "123", "phoneId": 103, "phoneRam": 256, "phoneFee": 299900 } ] }, { "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 }