日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringData JPA条件查询、排序、分页查询

發布時間:2025/3/20 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringData JPA条件查询、排序、分页查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在剛開始學習的時候,在dao的定義的接口需要繼承JpaRepository<T, ID>接口JpaSpecificationExecutor< T >接口,但是一直以來我用到的都只是JpaRepository,用于自動生成相關SQL語句簡化代碼。而JpaSpecificationExecutor給我的感覺就可有可無了,直到最近才發現它的用處,在此記錄一波。因為是學習筆記的關系,所以里面都只是截取關鍵的代碼進行記錄。

正文

要想使用Spring Data JPA,需要在pom.xml中添加以下依賴:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.7.RELEASE</version><relativePath/> <!-- lookup parent from repository --> </parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency> <dependencies>

如前言所說,帶條件的分頁查詢方法是被定義在JpaSpecificationExecutor接口中的,所以這里需要繼承這個接口。

/*** @author Veggie* @date 2019/8/14 - 14:11*/ @Repository public interface MessageRepository extends JpaRepository<Message, Long>, JpaSpecificationExecutor<Message> { }

1. 條件查詢

自定義查詢條件的步驟:

  • 實現Specification< T >接口(提供泛型;查詢的對象類型)
  • 實現toPredicate方法(構造查詢條件)
  • 需要借助方法參數中的兩個參數:
    root:獲取需要查詢的對象屬性
    CriteriaBuilder:構造查詢條件,內部封裝了很多查詢條件(模糊匹配,精準匹配)
  • //自定義查詢條件 Specification<Message> spec = new Specification<Message>() {@Overridepublic Predicate toPredicate(Root<Message> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {//根據屬性名獲取查詢對象的屬性Path<Message> path = root.get("receiverName");//相當于 where receiverName = "Veggie", CriteriaBuilder接口中還有很多查詢條件,建議看源碼Predicate equal = criteriaBuilder.equal(path, "Veggie");return equal;}} //進行條件查詢,findAll()方法中的參數即為條件 List<Message> result = MessageRepository.findAll(spec);

    當查詢條件用到gt, ge, lt, le, like(分別表示>, >=, <, <=,模糊查詢)時,需要表明查詢對象屬性的類別,如下所示:

    //查詢用戶名以"V"開頭的用戶 Predicate like = criteriaBuilder.like(path.as(String.class), "V%");

    2. 排序

    排序用到的是一個Sort類,它是查詢的排序選項(看源碼,有介紹)
    它初始化是用到的參數第一個參數:
    Sort.Direction.DESC表示降序
    Sort.Direction.ASC表示升序

    隨后的參數就是要排序的屬性列表,可以有多個參數,也可以直接用List傳,但是至少傳入一個屬性。

    Sort sort = new Sort(Sort.Direction.DESC, "id"); //sort作為findAll()方法中的參數,查詢得到得到的結果是經過排序的 List<Message> result = MessageRepository.findAll(sort);

    3.分頁查詢

    分頁需要設置分頁參數類Pageable,初始化主要是有兩個參數:第一個是查詢的頁碼(下標從0開始),第二個是每頁查詢的條數,比如說結果有55條,如果每頁查詢10條,結果就會被分成6頁。也可以添加
    注意:原來用到的new PageRequest()已經過時,現在用PageRequest.of()來實現。

    Page接口是封裝為Spring Data Jpa 內部的page bean,它的常用方法如下:

    //獲取總頁數 int getTotalPages(); //獲取總記錄數 long getTotalElements(); //獲取列表數據 List<T> getContent();

    分頁查詢的代碼如下:

    //設置分頁參數 Pageable pageable = PageRequest.of(05); //分頁查詢 Page<Message> page = MessageRepository.findAll(pageable);

    4. 完整的方法代碼

    完整的代碼是以上三個知識點的集合,是帶條件的分頁查詢,查詢得到的結果按id號降序排序。

    @RequestMapping(path = "/page")public List<Message> queryPage(@RequestBody Map<String, Object> params) {/*** 自定義查詢條件* 1. 實現Specification接口(提供泛型;查詢的對象類型)* 2. 實現toPredicate方法(構造查詢條件)* 3. 需要借助方法參數中的兩個參數(* root:獲取需要查詢的對象屬性* CriteriaBuilder:構造查詢條件,內部封裝了很多查詢條件(模糊匹配,精準匹配)*/Specification<Message> spec = new Specification<Message>() {@Overridepublic Predicate toPredicate(Root<Message> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {Path<Message> path = root.get("receiverName");Predicate equal = criteriaBuilder.equal(path, "Veggie");return equal;}};Integer pageNo = Integer.valueOf((String) params.get("pageNo"));Integer pageSize = Integer.valueOf((String)params.get("pageSize"));/*** 添加排序Sort* Sort.Direction.DESC表示降序* Sort.Direction.ASC表示升序* properties是指實體類的屬性名(不是字段名)*/Sort sort = new Sort(Sort.Direction.ASC, "id");/*** 分頁參數Pageable* 參數1:查詢的頁碼* 參數2:每頁查詢的條數* 參數3:查詢結果的排序規則(可選*/Pageable pageable = PageRequest.of(pageNo, pageSize, sort); //原來的new PageRequest()已經過時/*** 分頁查詢* 參數1:查詢條件Specification* 參數2:分頁參數Pageable*/Page<Message> page = MessageRepository.findAll(spec, pageable);return page.getContent();}

    感悟

    既然都寫博客了,順帶記錄最近學習以及和大佬交談的感悟:

  • 理解概念:在學習的時候,不能僅僅想著敲代碼,要多關注一些相關概念的理解,就比如說JPA、 Hibernate和SpringData JPA各自的基本概念,他們之間有什么關系之類的。
  • 多看源碼:我具體也說不上來,就本能的感覺這個很重要。有時候一看源碼,可以理解之前想了很久都沒有想明白的問題。其次,看某個類或接口的源碼時,還可以了解到這個類可以提供什么方法(一般都會有英文注釋的)。
  • 思維導圖:就像看書一定要想看目錄,學習新的內容應該先做個思維導圖。它以讓我們對一樣東西的總體有比較直觀、系統的認識,可以讓學習的思路變得清晰,可以避免浪費一些不必要 的時間。
  • 多做筆記:連dalao都記不住之前學過的東西,何況我等凡夫俗子。做筆記不僅可以備忘,避免踩同樣的坑,還可以加深對該部分知識的理解。
  • 參考資料

  • https://www.bilibili.com/video/av53910024/?p=65
  • 總結

    以上是生活随笔為你收集整理的SpringData JPA条件查询、排序、分页查询的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。