經(jīng)歷了無數(shù)次的嘗試之后終于實現(xiàn)了分頁這個功能,體會到了作為一名程序媛的痛苦。?
easyui前臺實現(xiàn)分頁很是簡單?。?!封裝的太好了。。這里僅僅介紹后臺遇到的大坑??!
Spring data JPA對于分頁和排序的查詢有著完美的支持。實現(xiàn)分頁時,需要繼承PagingAndSortingRepository.
在XxxRepository.java中定義了一個方法。例如:
Page<Department> findById(Integer id, Pageable pageable);
??Pageable是Spring Data庫中定義的一個接口,該接口是所有分頁相關(guān)信息的一個抽象。通過該接口,我們可以得到和分頁相關(guān)所有信息(例如pageNumber、pageSize等),這樣,Jpa就能夠通過pageable參數(shù)來得到一個帶分頁信息的Sql語句。
??Page也是Spring Data提供的一個接口,該接口表示一部分?jǐn)?shù)據(jù)的集合以及其相關(guān)的下一部分?jǐn)?shù)據(jù)、數(shù)據(jù)總數(shù)等相關(guān)信息,通過該接口,我們可以得到數(shù)據(jù)的總體信息(數(shù)據(jù)總數(shù)、總頁數(shù)...)以及當(dāng)前數(shù)據(jù)的信息(當(dāng)前數(shù)據(jù)的集合、當(dāng)前頁數(shù)等)
Spring Data Jpa除了會通過命名規(guī)范幫助我們擴展Sql語句外,還會幫助我們處理類型為Pageable的參數(shù),將pageable參數(shù)轉(zhuǎn)換成為sql語句中的條件,同時,還會幫助我們處理類型為Page的返回值,當(dāng)發(fā)現(xiàn)返回值類型為Page,Spring Data Jpa將會把數(shù)據(jù)的整體信息、當(dāng)前數(shù)據(jù)的信息,分頁的信息都放入到返回值中。這樣,我們就能夠方便的進行個性化的分頁查詢。
service中的方法:
public Page<T> findAllT(Pageable pageable){
return this.xxxRepository.findAll(pageable);
}
public Page<T> findById(Integer id,Pageable pageable){
return this.xxxRepository.findById(id,pageable);
}```
#####controller中的方法(用的springBoot技術(shù),controller上有@RestController注解):
//全部分頁顯示
@RequestMapping(value = "/displayAll",method = RequestMethod.GET)
public Map<String,java.lang.Object> findAllDepartments(@RequestParam(value = "page")Integer page, @RequestParam(value = "rows")Integer size){
Page<Department> list= this.departmentService.findAllDepartment(new PageRequest(page-1,size));
Map<String,java.lang.Object> map = new HashMap<String,java.lang.Object>();
int total = this.departmentService.findAllDepartment().size();
map.put("total",total);
map.put("rows",list.getContent());
return map ;
}
//有條件的分頁顯示
@RequestMapping(value = "/display",method = RequestMethod.GET)
public Map<String,java.lang.Object> findById(@RequestParam("id") Integer id,@RequestParam(value = "page")Integer page,@RequestParam(value = "rows")Integer size ){
Map<String,java.lang.Object> map = new HashMap<String,java.lang.Object>();
Pageable pageable = new PageRequest(page-1,size);
Page<T> list = this.xxxService.findById(id,pageable);
int total = this.departmentService.findById(id).size();
map.put("total",total);
map.put("rows",list.getContent());
return map;
}```
前臺使用的是easyui技術(shù),datagrid實現(xiàn)分頁時,它會自動向后臺傳遞page(第幾頁,easyui傳過來的page默認(rèn)值是1)和rows(每頁上顯示的記錄數(shù),我們將每頁的大小固定為10條記錄)。后臺需要做的接收前臺傳過來的兩個參數(shù)。并向前臺傳遞total(記錄的總數(shù))和rows(這里的rows指的是具體的記錄內(nèi)容)。
出現(xiàn)的問題:
1、

所示的錯誤是因為沒有l(wèi)ength,返回的模型和需要的模型不兼容。
2、
??后臺將方法寫出來以后(此時的代碼為: map.put("rows",list);),前臺就是不顯示。單獨運行相應(yīng)的URL得到JSON數(shù)據(jù)的部分截圖如下:

如上圖所示可知后臺的分頁方法是對的,而且能得到JSON數(shù)據(jù)為啥就是不顯示呢?
原因是返回JSON數(shù)據(jù)的模型不符合easyui datagrid需要的模型(datagrid需要一個模型數(shù)組,或者是一個包含rows和total的對象)。見下圖

而我們得到的JSON數(shù)據(jù)的模型如下圖:
{
"total":15,
"rows":{
"content":[
{"id":1,"Name":"XXXXX","school":{"id":1,"schoolName":"XXXX","departments":[{"id":1,"departmentName":"XXXXX","school":1},","school":3},{"id":15,"departmentName":"jjjj","school":3}]}},{"id":9,"departmentName":"xxx","school":1},{"id":10,"departmentName":"xxx","school":2},{"id":13,"departmentName":"xxx","":1}
],
"last":false,
"totalPages":2,
"totalElements":15,
"number":0,
"size":10,
"sort":null,
"first":true,
"numberOfElements":10
}
}
我們得到的rows并不是一個數(shù)組([]),它是一個對象({}),而它的content屬性才是我們需要的模型。所以在controller中修改 map.put("rows",list.getContent());最后成功顯示了。
如有不對的地方 歡迎指出?。?!