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

Spring Data JPA帶條件分頁查詢實(shí)現(xiàn)原理

 更新時(shí)間:2020年05月26日 10:42:57   作者:銀色甲殼蟲  
這篇文章主要介紹了Spring Data JPA帶條件分頁查詢實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

最新Spring Data JPA官方參考手冊(cè) Version 2.0.0.RC2,2017-07-25

https://docs.spring.io/spring-data/jpa/docs/2.0.0.RC2/reference/html/

JPA參考手冊(cè) (找了半天, 在線版的只找到這個(gè))

https://www.objectdb.com/java/jpa

Spring Data JPA的Specification類, 是按照Eric Evans的《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》書中Specification的概念和語義來定義查詢條件的API。
使用Spring Data JPA, 我們一般將自己的dao接口繼承CrudRepository接口和JpaSpecificationExecutor接口, 由框架生成代理類來完成具體的調(diào)用, 而不用自己寫daoImpl實(shí)現(xiàn)類, 因?yàn)檫@兩個(gè)接口自帶了很多方法, 如果我們寫實(shí)現(xiàn)類會(huì)發(fā)現(xiàn)一上來就需要實(shí)現(xiàn)十來個(gè)方法, 比較麻煩。

其中CrudRepository接口主要負(fù)責(zé)增/刪/改的操作, JpaSpecificationExecutor接口主要負(fù)責(zé)查詢的操作, 另外, 框架還支持在dao接口的方法名上定義一些簡單的語義來進(jìn)行增刪改查, 底層會(huì)對(duì)應(yīng)地做具體實(shí)現(xiàn)。

那如何封裝具體的查詢條件呢?

在service層調(diào)用dao接口從JpaSpecificationExecutor繼承的抽象查詢方法, 它就會(huì)自動(dòng)讓你準(zhǔn)備相關(guān)實(shí)參, 其中Specification對(duì)象就是經(jīng)常用在條件查詢的方法的一個(gè)形參, 也就是說, 封裝查詢條件的過程轉(zhuǎn)移到service層了。

我們一般以匿名內(nèi)部類的方式new一個(gè)Specification對(duì)象, 實(shí)現(xiàn)其中的toPredicate方法, 舉個(gè)例子,

Specification<Person> specification = new Specification<Person>() {
      @Override
      public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
      ...
};

其中, Predicate, Root, CriteriaQuery, CriteriaBuilder都是javax.persistence包中的接口, 方法的這3個(gè)實(shí)參由框架交給我們。

Predicate意思是"描述語", 就是我們封裝完查詢條件后要交給Specification一個(gè)清楚的描述, 要怎么組合sql語句去查詢。

Root表示為泛型里的Person對(duì)象描述一個(gè)根位置, 可以從這個(gè)根位置去取該對(duì)象的屬性, 以及屬性的屬性, 類似對(duì)象導(dǎo)航的意思, 比如要取Person地址屬性的城市, 就可以root.get("address").get("city").as(String.class), 其返回值是一個(gè)Expression對(duì)象;

CriteriaQuery代表?xiàng)l件查詢,主要提供where、group by、having、order by等。

CriteriaBuilder用于構(gòu)造篩選條件,主要提供equal、and、or、lt、gt、between、like等, 以及獲得CriteriaQuery、CriteriaUpdate、CriteriaDelete對(duì)象。構(gòu)造每個(gè)篩選條件一般需要Expression類型作為實(shí)參, 可以通過Root對(duì)象調(diào)用get()方法得到。如果有多個(gè)篩選條件, 調(diào)用criteriaBuilder的and、or等方法連接起來, 一般是鏈?zhǔn)秸{(diào)用的形式。

舉個(gè)簡單的實(shí)際例子:

//帶條件的分頁查詢, 根據(jù)person的first_name和last_name進(jìn)行模糊查詢
//為了直觀, 假設(shè)兩個(gè)字段都存在且不為空串, 省掉非空判斷和對(duì)應(yīng)的處理
public Page<Person> findSearch(Person person, int page, int size) {
  Specification<Person> specification = new Specification<Person>() {
   @Override
   public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
      Predicate predicate1 = criteriaBuilder.like(root.get("first_name").as(String.class), "%"+person.getFirstName()+"%");
      Predicate predicate2 = criteriaBuilder.like(root.get("last_name").as(String.class), "%"+person.getLastName()+"%");
        Predicate finalPredicate = criteriaBuilder.and(predicate1, predicate2);
       return finalPredicate;
   }
  };
  PageRequest pageRequest = PageRequest.of(page-1, size);
  return personDao.findAll(specification, pageRequest);
}

當(dāng)然這都是JPQL的語法了, 很多開發(fā)者也經(jīng)常在dao接口中直接寫SQL語句來讓框架查詢, 使用起來感覺有點(diǎn)類似MyBatis, 會(huì)顯得清爽很多, 只需定義一個(gè)抽象方法加上對(duì)應(yīng)的注解@Modifying和@Query(value="sql語句", nativeQuery=true)即可, 它還有一個(gè)好處, 不用讓封裝查詢條件這種事情跑到service層去。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 四步輕松搞定java web每天定時(shí)執(zhí)行任務(wù)

    四步輕松搞定java web每天定時(shí)執(zhí)行任務(wù)

    本篇文章主要介紹了四步輕松搞定java web每天定時(shí)執(zhí)行任務(wù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java 在PDF中添加騎縫章示例解析

    Java 在PDF中添加騎縫章示例解析

    這篇文章主要介紹了Java 在PDF中添加騎縫章示例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • MyBatis-Plus之@TableField的用法解讀

    MyBatis-Plus之@TableField的用法解讀

    這篇文章主要介紹了MyBatis-Plus之@TableField的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 在Spring Boot中如何使用log4j記錄日志

    在Spring Boot中如何使用log4j記錄日志

    這篇文章主要介紹如何在spring boot中引入log4j,以及一些基礎(chǔ)用法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • Java Gradle項(xiàng)目中的資源正確獲取方式

    Java Gradle項(xiàng)目中的資源正確獲取方式

    這篇文章主要介紹了Java Gradle項(xiàng)目中的資源正確獲取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java利用StringBuffer替換特殊字符的方法實(shí)現(xiàn)

    Java利用StringBuffer替換特殊字符的方法實(shí)現(xiàn)

    這篇文章主要介紹了Java利用StringBuffer替換特殊字符的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java駝峰轉(zhuǎn)換的方法

    java駝峰轉(zhuǎn)換的方法

    這篇文章主要為大家詳細(xì)介紹了java駝峰轉(zhuǎn)換的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • java編寫ftp下載工具

    java編寫ftp下載工具

    本文給大家介紹的是如何一步步實(shí)現(xiàn)使用java編寫FTP下載工具,而且是在Linux環(huán)境下使用javac編譯的,在運(yùn)行和編譯上有些不同之處,有需要的小伙伴們參考下吧。
    2015-03-03
  • 微信小程序后端Java接口開發(fā)的詳細(xì)步驟

    微信小程序后端Java接口開發(fā)的詳細(xì)步驟

    現(xiàn)在微信小程序越來越火了,相信不少人都通過各種途徑學(xué)習(xí)過微信小程序或者嘗試開發(fā),本文就介紹了微信小程序后端Java接口開發(fā)的詳細(xì)步驟,感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-11-11
  • Java中策略設(shè)計(jì)模式的實(shí)現(xiàn)及應(yīng)用場(chǎng)景

    Java中策略設(shè)計(jì)模式的實(shí)現(xiàn)及應(yīng)用場(chǎng)景

    策略設(shè)計(jì)模式是Java中一種常用的設(shè)計(jì)模式,它通過定義一系列算法并將其封裝成獨(dú)立的策略類,從而使得算法可以在不影響客戶端的情況下隨時(shí)切換。策略設(shè)計(jì)模式主要應(yīng)用于系統(tǒng)中存在多種相似的算法、需要靈活調(diào)整算法邏輯或者需要擴(kuò)展新的算法等場(chǎng)景
    2023-04-04

最新評(píng)論