1. 程式人生 > >PageHelpher、MyBatis關聯查詢,多表查詢分頁問題

PageHelpher、MyBatis關聯查詢,多表查詢分頁問題

一般MyBatis作為ORM框架,需要做分頁一般會選擇使用PageHelper。PageHelper非常強大的分頁外掛,和mybatis整合也非常方便。PageHelper對單表分頁或者整體結果集分頁是比較方便的。

不過有時我們會遇到這樣的問題。利用MyBatis做多表的關聯查詢,分頁的物件不是所有結果集,而是對其中一張表分頁,然後再關聯其他表的資料,如果直接使用PageHelper進行分頁的話,分頁結果可能會不正確。

舉個例子:

SELECT d.*,c.* FROM channel_data d LEFT JOIN channel_comment c 
    ON d.id = c.dataId  ORDER BY d.pubtime DESC,c.pubtime ASC LIMIT 0,15

比如 channel_data裡面有5條資料。channel_comment裡面的資料與channel_data有關聯,channel_data與channel_comment是一對多的關係。也就是說一個channel_data物件裡面可能包含了多條channel_comment。也就是channel_data物件裡面有一個List存放channel_comment。那麼查詢的時候自然是要對channel_data進行分頁。但如果直接用PageHelpher分頁,產生的SQL就如上面所示。通過left join 查詢出的資料不止5條。那麼PageHelper的分頁機制得出的結果就不是我們想要的。

怎麼解決這個問題呢?有些網友提出,如果PageHelper能解析sql註釋的方法就好了。

據瞭解,在sql新增/**/這種註釋是SQL的標準語法,在mapper中定義的sql中新增這種註釋,mybatis也會把註釋透傳給資料庫,如此一來,就可以用註釋來作文章,比如:

select * from (/*start*/select * from a/*end*/) ta left join b tb on tb.ref_id = ta.id

pagehelper是有解析sql的步驟的,那麼可以通過解析“start”“end”這種註釋標籤,來知曉新增分頁、排序的位置。那麼不就可以指定分頁的位置了嗎?想法是好的,但顯然PageHelper目前不具備這個能力。

所以我們只能手動構造分頁SQL而不能直接用PageHelper。額,好像到頭來什麼都沒有說。

但一般遇到這種情況,我們會先把需要分頁的資料分頁。得到其結果集後再進行關聯查詢。這樣就可以得到想要的結果。

比如上面的SQL就變為:

    SELECT d.*,c.* FROM (SELECT * FROM channel_data  LIMIT 0,15) d LEFT JOIN channel_comment c 
    ON d.id = c.dataId  ORDER BY d.pubtime DESC,c.pubtime ASC

這樣查詢就能得到想要的結果集了,只不過需要自己手動統計count。