欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用spring?data的page和pageable如何實(shí)現(xiàn)分頁查詢

 更新時間:2022年12月08日 09:50:47   作者:scluis  
這篇文章主要介紹了使用spring?data的page和pageable如何實(shí)現(xiàn)分頁查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

spring data的page和pageable實(shí)現(xiàn)分頁查詢

總結(jié)一下利用pageable和page實(shí)現(xiàn)分頁查詢的方法

Pageable

Pageable 是Spring Data中定義的一個接口,用于構(gòu)造分頁查詢請求,通過該接口,我們可以得到和分頁查詢請求相關(guān)的所有信息,這樣,Jpa就能夠通過Pageable來查詢數(shù)據(jù)庫。

Pageable的屬性如下:

{
? "page"://查詢第幾頁,從0開始,默認(rèn)為0也就是查詢第一頁
? "size"://每一頁的顯示的數(shù)量,默認(rèn)為20
? "sort"://排序相關(guān)的信息,可以指明查詢結(jié)果在頁面顯示的排序方式
}

Page

Page用來存儲我們查詢返回的結(jié)果,包含了分頁查詢結(jié)果的必要屬性。

page的屬性如下:

{
? "content":,//數(shù)據(jù)內(nèi)容
? "last":false,//是否最后一頁
? "totalPages":,//總頁數(shù)
? "totalElements":,//總數(shù)據(jù)數(shù)
? "size":,//一頁數(shù)據(jù)大小
? "number":,//當(dāng)前顯示的是第幾頁,0代表第一頁
? "first":,//是否第一頁
? "sort":[{//每頁數(shù)據(jù)排序方式
? ? "direction":"DESC",//排序方式
? ? "property":"id",//排序依據(jù)的屬性
? ? "ignoreCase":false,
? ? "nullHandling":"NATIVE",
? ? "ascending":false
? }],
? "numberOfElements":15
}

代碼實(shí)現(xiàn)

前端(thymeleaf):

?<a href="#" rel="external nofollow"  class="item" th:href="@{/admin/types}" rel="external nofollow" >列表</a>

后端controller:

@Controller
@RequestMapping("/admin/types")
public class typeController {
? ? @Autowired
? ? private typeService typeService;

? ? @GetMapping
? ? //分頁顯示type列表,PageableDefault注解指明分頁的默認(rèn)參數(shù)
? ? public String types(@PageableDefault(size = 6,sort = {"id"},direction = Sort.Direction.DESC) Pageable pageable
? ? , Model model){//利用spring data pageable實(shí)現(xiàn)分頁,注意是org.springframework.data.domain包下
? ? ? ? //把查詢出的數(shù)據(jù)放到model
? ? ? ? model.addAttribute("page",typeService.getTypeList(pageable));
? ? ? ? return "admin/types";
? ? }

后端service:

? ? public Page<Type> getTypeList(Pageable pageable) {
? ? ? ? return typeRepository.findAll(pageable);
? ? }

后端dao:

public interface typeRepository extends JpaRepository<Type,Long> {
}

(Spring)SpringData通用分頁查詢

通常情況下,SpringData是有提供相應(yīng)的分頁查詢接口的,比如在我的另一篇博文中SpringData ES中提到的那樣。但是這種方式,一般僅限于最直接的分頁查詢,不適用于更深層次的嵌套。比如ES中嵌在其他實(shí)體中的nested實(shí)體,本文也是為了解決這個問題才做的學(xué)習(xí)。

思路

一個最直接的想法就是查詢出所需要的數(shù)據(jù),一般是一個List,然后將List轉(zhuǎn)成Page.

實(shí)現(xiàn)

List轉(zhuǎn)Page的分頁接口

package cn.edu.zucc.syx.rec.util;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;

import java.util.ArrayList;
import java.util.List;

public interface PageUtil {

? ? /**
? ? ?* Create a {@link org.springframework.data.domain.Page} from a {@link java.util.List} of objects
? ? ?*
? ? ?* @param list ? ? List數(shù)據(jù)
? ? ?* @param pageable 分頁參數(shù).
? ? ?* @param <T> ? ? 包含數(shù)據(jù)
? ? ?* @return page
? ? ?*/
? ? static <T> Page<T> createPageFromList(List<T> list, Pageable pageable) {
? ? ? ? if (list == null) {
? ? ? ? ? ? throw new IllegalArgumentException("list不能為空");
? ? ? ? }

? ? ? ? int startOfPage = pageable.getPageNumber() * pageable.getPageSize();
? ? ? ? if (startOfPage > list.size()) {
? ? ? ? ? ? return new PageImpl<>(new ArrayList<>(), pageable, 0);
? ? ? ? }

? ? ? ? int endOfPage = Math.min(startOfPage + pageable.getPageSize(), list.size());
? ? ? ? return new PageImpl<>(list.subList(startOfPage, endOfPage), pageable, list.size());
? ? }
}

Enttity(Getter,Setter,Construct省略,請自己補(bǔ)全)

@Document(indexName= "sheet", type= "sheet")
public class Sheet {

? ? @Id
? ? @Field(type = FieldType.Keyword)
? ? private String id;
? ? @Field(type = FieldType.Keyword)
? ? private String name;
? ? @Field(type = FieldType.Text)
? ? private String description;
? ? @Field(type = FieldType.Keyword)
? ? private String creator_id;
? ? @Field(type = FieldType.Keyword)
? ? private String creator_name;
? ? @Field(type = FieldType.Boolean)
? ? private Boolean is_open;
? ? @Field(type = FieldType.Nested)
? ? private List<KeySong> songs;
Repository
public interface SheetRepository extends ElasticsearchRepository<Sheet, Integer> {
? ? List<Sheet> findByNameLike(String name);
}

Service接口

public interface SheetService {
? ? Sheet getInfo(String sheetId);
}

Service實(shí)現(xiàn)類

? ? @Override
? ? public Sheet getInfo(String sheetId) {
? ? ? ? return sheetRepository.findById(sheetId);
? ? }
Controller
? ? /**
? ? ?* 查看歌單詳情(含分頁)
? ? ?*/
? ? @GetMapping("/get_info")
? ? public JSONObject getsth(@RequestParam("sheet_id") String sheetId,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @RequestParam("page_num") int pageNum,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @RequestParam("page_size") int pageSize){
? ? ? ? JSONObject ret = new JSONObject();

? ? ? ? try {
? ? ? ? ? ? Sheet sheet = sheetService.getInfo(sheetId);
? ? ? ? ? ? List<KeySong> songs = sheet.getSongs();
? ? ? ? ? ? Pageable pageable = PageRequest.of(pageNum-1, pageSize);
? ? ? ? ? ? Page<KeySong> page = PageUtil.createPageFromList(songs, pageable);
? ? ? ? ? ? ret = util.sheetInfoPage2Json(sheet, page);
? ? ? ? }catch (Exception e){
? ? ? ? ? ? ret.put("code", "error");
? ? ? ? ? ? ret.put("msg", "failed");
? ? ? ? }

? ? ? ? return ret;
? ? }

上面涉及到的工具類

? ? public JSONObject sheetInfoPage2Json(Sheet sheet, Page<KeySong> page){
? ? ? ? JSONObject ret = new JSONObject();
? ? ? ? JSONObject tmp = new JSONObject();
? ? ? ? tmp.put("sheet_id", sheet.getId());
? ? ? ? tmp.put("sheet_name", sheet.getName());
? ? ? ? tmp.put("description", sheet.getDescription());
? ? ? ? tmp.put("page_total", page.getTotalPages());
? ? ? ? tmp.put("page_num", page.getNumber()+1);
? ? ? ? tmp.put("page_size", page.getSize());
? ? ? ? List<KeySong> songs = page.getContent();
? ? ? ? tmp.put("songs", songs);
? ? ? ? ret.put("code", Statue.SUCCESS);
? ? ? ? ret.put("data", tmp);

? ? ? ? return ret;
? ? }

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringSession 請求與響應(yīng)重寫的實(shí)現(xiàn)

    SpringSession 請求與響應(yīng)重寫的實(shí)現(xiàn)

    這篇文章主要介紹了SpringSession 請求與響應(yīng)重寫的實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • Java實(shí)現(xiàn)解析.xlsb文件的示例代碼

    Java實(shí)現(xiàn)解析.xlsb文件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)解析.xlsb文件的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以了解一下
    2023-01-01
  • java使用jna調(diào)用c#中dll的方法詳解

    java使用jna調(diào)用c#中dll的方法詳解

    前一段時間接了個項(xiàng)目,需要用到第三方提供的C#編寫的dll,本身項(xiàng)目是java語言,所以便有了下面這篇文章,本文給大家介紹了關(guān)于java中如何使用jna調(diào)用c#中dll的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • 基于FeignClient調(diào)用超時的處理方案

    基于FeignClient調(diào)用超時的處理方案

    這篇文章主要介紹了基于FeignClient調(diào)用超時的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java 中平方根(sqrt)算法 的實(shí)例詳解

    java 中平方根(sqrt)算法 的實(shí)例詳解

    這篇文章主要介紹了java 中平方根(sqrt)算法 的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • SpringMVC日期類型參數(shù)傳遞實(shí)現(xiàn)步驟講解

    SpringMVC日期類型參數(shù)傳遞實(shí)現(xiàn)步驟講解

    這篇文章主要介紹了SpringMVC日期類型參數(shù)傳遞實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • Java Swing窗體關(guān)閉事件的調(diào)用關(guān)系

    Java Swing窗體關(guān)閉事件的調(diào)用關(guān)系

    這篇文章主要為大家詳細(xì)介紹了Java Swing窗體關(guān)閉事件的調(diào)用關(guān)系,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • IDEA自動補(bǔ)全返回值的三種快捷方式

    IDEA自動補(bǔ)全返回值的三種快捷方式

    平常在編碼的過程中,可能需要調(diào)用第三方Api接口,這個過程中可能涉及到不太熟悉第三方Api接口的返回值類型,平常在編碼的過程中,可能需要調(diào)用第三方Api接口,這個過程中可能涉及到不太熟悉第三方Api接口的返回值類型,需要的朋友可以參考下
    2023-10-10
  • maven學(xué)習(xí)-初窺門徑

    maven學(xué)習(xí)-初窺門徑

    這篇文章主要介紹了maven的簡單知識,介紹了maven的定義及核心功能,具有一定參考價值,大家可以了解下。
    2017-10-10
  • Spring AOP的底層實(shí)現(xiàn)方式-代理模式

    Spring AOP的底層實(shí)現(xiàn)方式-代理模式

    這篇文章主要介紹了Spring AOP的底層實(shí)現(xiàn)方式-代理模式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論