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.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
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM