import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Page;
1.Pageable概述
Page<User> findByAge(int age, Pageable pageable);
Pageable 是Spring Data庫中定義的一個接口,用於構造翻頁查詢,是所有分頁相關信息的一個抽象,通過該接口,我們可以得到和分頁相關所有信息(例如pageNumber、pageSize等),這樣,Jpa就能夠通過pageable參數來得到一個帶分頁信息的Sql語句。
2.Pageable實現:PageRequest
靜態方法獲取對象
static PageRequest of(int page, int size)
與static PageRequest of(int page, int size, Sort sort)
3.直接獲取Pageable對象
我們只需要在方法的參數中直接定義一個pageable類型的參數,當Spring發現這個參數時,Spring會自動的根據request的參數來組裝該pageable對象
Spring支持的request參數如下:
- page,第幾頁,從0開始,默認為第0頁
- size,每一頁的大小,默認為20
- sort,排序相關的信息,例如sort=firstname&sort=lastname,desc表示在按firstname正序排列基礎上按lastname倒序排列
@RequestMapping("list")
public Page<T> getEntryByPageable(@PageableDefault(value = 15, sort = { "id" }, direction = Sort.Direction.DESC)
Pageable pageable) {
return dao.findAll(pageable);
}
四.Pageable接口
public interface Pageable {
//返回要返回的頁面.
int getPageNumber();
// 返回要返回的項目的數量。
int getPageSize();
//根據底層頁面和頁面大小返回偏移量。
int getOffset();
//返回排序參數。
Sort getSort();
}
五.Page接口
Page<User> findByAge(int age, Pageable pageable);
用於儲存查詢的結果集
public interface Page<T> extends Iterable<T> {
int getNumber(); //當前第幾頁,總是非負的
int getSize(); //@常用:返回當前頁面的大小。
int getTotalPages(); //@常用:返回分頁總數。
int getNumberOfElements(); //返回當前頁上的元素數。
long getTotalElements(); //@常用:返回元素總數。
boolean hasPreviousPage(); //返回如果有上一頁。
boolean isFirstPage(); //返回當前頁是否為第一頁。
boolean hasNextPage(); //返回如果有下一頁。
boolean isLastPage(); //返回當前頁是否為最后一頁。
Iterator<T> iterator();
List<T> getContent(); //@常用:將所有數據返回為List
boolean hasContent(); //返回數據是否有內容。
Sort getSort(); //返回頁的排序參數。
}
六.Page接口實現PageImpl
構造函數PageImpl(List<T> content)
與PageImpl(List<T> content, Pageable pageable, long total)
成員方法
List<T> getContent()
Pageable getPageable()
long getTotalElements()
int getTotalPages()
Sort getSort()
int getSize()
七.使用
@GetMapping("/showMarkerByPage/{page}")
public Result showMarkerController(@PathVariable("page") int page){
PageRequest pageRequest = PageRequest.of(page, 5);
Page<Marker> markerPage = markerService.findMarker(pageRequest);
for (int i = 0; i < markerPage.getContent().size(); i++) {
System.out.println(markerPage.getContent().get(i));
System.out.println(markerPage.getTotalElements());
}
if (markerPage.getContent()!=null) {
return ResultUtil.success(markerPage.getContent(), "/showMarker");
}else {
return ResultUtil.error(1, "查詢失敗", "/showMarker");
}
}