Mybatis plus 一對多關聯查詢分頁不準確的問題

大星說爬蟲發表於2023-12-29

場景說明

比如有個伺服器管理頁面。要顯示伺服器資訊,並且包含其擁有的賬號資訊。展示示例如下:






表結構資訊如下:


t_server



t_server_user



查詢sql

select

ts.id,

ts.host,

tsu.id as user_id,

tsu.user_name ,

tsu.server_id ,

tsu.port

from

t_server ts

left join t_server_user tsu on

ts.id = tsu.server_id

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

查詢結果



問題點

我們在程式碼中定義的ResultMap


<resultMap id="QueryServerResultMap" type="com.yyoo.deployer.beans.ServerBean" extends="com.yyoo.deployer.mapper.ServerMapper.BaseResultMap">

        <collection property="userList"  ofType="com.yyoo.deployer.entity.ServerUserBean">

            <id column="user_id" property="id"/>

            <result column="user_name" property="userName" />

            <result column="pass" property="pass" />

            <result column="port" property="port" />

            <result column="server_id" property="serverId"/>

        </collection>

    </resultMap>

1.

2.

3.

4.

5.

6.

7.

8.

9.

此處我們使用了collection標籤。Mybatis會自動把上面的查詢結果進行歸類,形成一個server物件對應多個serverUser物件的形式。

這樣做,不分頁的時候是沒有問題的。關鍵是分頁的時候。


Mybatis在分頁的時候生成的sql如下(下面均為查詢第一頁每頁10條資料)


select

ts.id,

ts.host,

tsu.id as user_id,

tsu.user_name ,

tsu.server_id ,

tsu.port

from

t_server ts

left join t_server_user tsu on

ts.id = tsu.server_id

limit 10 offset 0

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

此語句的查詢結果為:(為了方便區分,結果為紅框部分)




按照我們的規則,最終形成的ServerBean其實只有6條。


解決辦法

1. 在 collection 標籤上使用子查詢

該辦法會有n+1查詢的問題,此處我們就不做詳細講解了。


2. 重新計算分頁的limit引數

該辦法計算起來有點難度,我們也不做講解


3. 自定義分頁查詢sql

其實造成這個問題的關鍵在於,sql查詢返回的條數,和Mybatis最終組裝後的結果bean的條數不一致。要一致的關鍵在於,我們的查詢主體是Server,我們將sql改造為如下方式


select

ts.id,

ts.host,

tsu.id as user_id,

tsu.user_name ,

tsu.server_id ,

tsu.port

from

(select * from t_server limit 10 offset 0 ) ts

left join t_server_user tsu on

ts.id = tsu.server_id

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

直接將分頁引數編寫好,查詢第一頁的10條server資訊。


注:採用此方式,我們就不能使用Mybatis的分頁機制了,引數不能使用Mybatis-plus的Page物件,需要自定義分頁資訊,採用list返回,而且還得自定義 count 的查詢語句。配套的 count查詢語句如下


select count(id)

        from t_server ts

1.

2.

我們的分頁和前端顯示都是針對server,所以此處的count查詢也只針對server。

-----------------------------------

©著作權歸作者所有:來自51CTO部落格作者wx6375958b5f6b5的原創作品,請聯絡作者獲取轉載授權,否則將追究法律責任

Mybatis plus 一對多關聯查詢分頁不準確的問題

https://blog.51cto.com/forlinkext/9023801


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70030722/viewspace-3002108/,如需轉載,請註明出處,否則將追究法律責任。

相關文章