springBoot+easyui +spring data JPA 實現(xiàn)分頁

經(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的對象)。見下圖
easyui分頁要求的數(shù)據(jù)模型

而我們得到的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());最后成功顯示了。
如有不對的地方 歡迎指出?。?!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容