spring data Slice 學習

需求

新開發一個接口,返回結果要求使用Slice替換原來的Page

Slice和Page的區別

首先,Page是繼承了Slice的,所以Page的功能要比Slice更多。

public interface Page<T> extends Slice<T> {
    int getTotalPages();

    long getTotalElements();

    <S> Page<S> map(Converter<? super T, ? extends S> var1);
}

然後從上面的方法中,我們就能看出,Page能夠獲取分頁中的所有結果。

Slice不同,再來看一下它的源碼:

public interface Slice<T> extends Iterable<T> {
    int getNumber();

    int getSize();

    int getNumberOfElements();

    List<T> getContent();

    boolean hasContent();

    Sort getSort();

    boolean isFirst();

    boolean isLast();

    boolean hasNext();

    boolean hasPrevious();

    Pageable nextPageable();

    Pageable previousPageable();

    <S> Slice<S> map(Converter<? super T, ? extends S> var1);
}

Slice只能獲取到當前頁的數據,然後通過上面的nextPageable()previousPageable()兩個方法,又能獲取到前一頁和後一頁的數據。所以上面的getNumber()getSize()getNumberOfElements()getContent()都是針對當前頁所說的。

Why Slice

看到這裏,我們就會疑惑了,既然Page的功能比Slice更加強大,那爲什麼我們還要使用Slice呢?

這個問題的答案,在官方文檔中給出瞭解釋:

A Page knows about the total number of elements and pages available. It does so by the infrastructure triggering a count query to calculate the overall number. As this might be expensive (depending on the store used), you can instead return a Slice. A Slice only knows about whether a next Slice is available, which might be sufficient when walking through a larger result set.

大概的意思就是說Page實現了獲取所有記錄的數量和頁面的總數,但是它是通過count query來計算的,所以這個代價就是很大的。

所以,當我們有一個很大的數據集的時候,Slice可能就能滿足我們的需求了。因爲大多數時候,我們並不需要知道結果集總數是多少。


官方文檔:https://docs.spring.io/spring...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章