Mybatis plus 一對多關聯查詢分頁不準確的問題
場景說明
比如有個伺服器管理頁面。要顯示伺服器資訊,並且包含其擁有的賬號資訊。展示示例如下:
表結構資訊如下:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 解決 mybatis一對多分頁問題 聯級查詢MyBatis
- Mybatis【15】-- Mybatis一對一多表關聯查詢MyBatis
- MyBatis初級實戰之六:一對多關聯查詢MyBatis
- 多對多關係自行維護單項關聯數量,加快分頁查詢
- MyBatis關聯查詢MyBatis
- MyBatis表關聯 一對多 多對一 多對多MyBatis
- spring data jpa關聯查詢(一對一、一對多、多對多)Spring
- 分頁查詢的排序問題排序
- 批次分頁查詢問題?
- MyBatis初級實戰之五:一對一關聯查詢MyBatis
- 分頁查詢的排序問題(二)排序
- 關於分頁查詢結果的快取問題快取
- 使用Mybatis-plus進行分頁查詢,沒有分頁效果,查詢的資料量超出每頁數量設定MyBatis
- MyBatis基礎:MyBatis關聯查詢(4)MyBatis
- 由一個博問學到的SQL查詢方法 (一道多對多關係查詢的面試題)SQL面試題
- gorm 關係一對一,一對多,多對多查詢GoORM
- 求助:DetachedCriteria關聯查詢問題~~
- 請教批次分頁查詢的問題
- MyBatis 查詢資料時屬性中多對一的問題(多條資料對應一條資料)MyBatis
- spring-data-jpa一對多、多對多雙向關聯,查詢操作的時候進入死迴圈問題Spring
- 關於 MyBatis-Plus 分頁查詢的探討 → count 都為 0 了,為什麼還要查詢記錄?MyBatis
- 關於查詢列表準確定位元素的問題,通常如何解決
- #MyBatis多表查詢 #多對一、一對多的兩種實現方式 @FDDLCMyBatis
- 兩表關聯查詢:sql、mybatisSQLMyBatis
- mybatis 一對一關聯MyBatis
- sql一關聯多查詢時否定篩選出現的問題的解決SQL
- 區分關聯子查詢和非關聯子查詢
- 關於Hibernate一對多關聯儲存問題
- mybatis-plus 使用In查詢MyBatis
- Mybatis封裝分頁查詢的java公用類MyBatis封裝Java
- MyBatisPlus怎麼多表關聯查詢?MyBatis
- 關於批次分頁查詢
- Mybatis分頁外掛只顯示第一頁的問題MyBatis
- Laravel 關聯查詢 ——一對一 簡單例子Laravel單例
- mybatis-plus連線SQL Server2012分頁查詢異常MyBatisSQLServer
- 【mybatis-plus】條件查詢MyBatis
- spring data jpa 多對一聯表查詢Spring
- mybatis plus 新增分頁外掛MyBatis