1. 程式人生 > >MyBatis分頁返回資料不對問題

MyBatis分頁返回資料不對問題

使用mybatis的分頁時,一定要注意使用方法。

當表關係為一對多、多對多時,普通直接分頁是有問題的,例如:

一個老師有多個學生,假設每個老師有2個學生,一共有15名老師,此時分頁查詢老師,每頁顯示10條。然而查詢到的結果是:每頁老師只有5名,一共有3頁。

sql語句:

select * from Teacher t inner join Student s on t.id = s.teacher_id where t.clazz_id = ? limit 0,10

原因:由於老師與學生是一對多,那麼用join語句查詢老師時,記錄一共實際上是有30條的,每個老師會重複兩遍(而學生的資料是不同的),那麼分頁雖然出來的是10條,然而有一半老師資料是重複的,經mybatis轉化成物件後,就是有5個老師(每個老師裡有2個學生,共10個學生)。總數由於是30條,那麼總頁數自然也會算成3頁了。

那麼遇到這種情況怎麼辦呢?

正確的做法是:分成2條sql語句

sql語句一:select t.id from Teacher t inner join Student s on t.id = s.teacher_id where t.clazz_id = ? group by t.id limit 0,10

sql語句二:select * from Teacher t inner join Student s on t.id = s.teacher_id where t.id in (?,?,?,?,?,?,?,?,?,?)

第一個sql語句的目的是根據查詢條件進行分頁查詢,通過group by語句對老師進行分組排重。

第二個sql語句的目的是關聯查詢出滿足分頁條件的老師id的所有老師及學生的資訊。

總結:造成分頁錯誤的原因是join的表是多的一端,但由於查詢條件中可能會有多的一端的條件,又不得不join關聯,因此必須採用group by語句排重,但我們希望通過mybatis將所有物件關係的資訊都返回,因此還要發條sql語句關聯查詢出所有表的資訊。