日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:128日期:2023-09-04 14:55:57

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

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

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

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

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

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

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

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

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

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

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

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

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

CriteriaQuery代表條件查詢,主要提供where、group by、having、order by等。

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

舉個簡單的實際例子:

//帶條件的分頁查詢, 根據(jù)person的first_name和last_name進行模糊查詢//為了直觀, 假設兩個字段都存在且不為空串, 省掉非空判斷和對應的處理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);}

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久亚洲视频| 欧美一级二级视频| 国产精久久一区二区| 尤物tv在线精品| 一区二区三区四区在线看| 久久国产主播| 日本精品不卡| 精品中文一区| 美女尤物久久精品| 中文字幕视频精品一区二区三区| 丝袜脚交一区二区| 亚洲精品日韩久久| 91成人精品在线| 国产精品va| 国产成人精品三级高清久久91| 精品国产乱码久久久| 综合日韩av| 久久久9色精品国产一区二区三区| 韩国久久久久久| 99精品电影| 欧美a级片一区| 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲18在线| 国产日产精品_国产精品毛片| 国产精品chinese| 91亚洲国产成人久久精品| 亚洲成人精品| 欧美专区一区二区三区| 91精品国产自产在线丝袜啪| 欧美国产专区| 欧美日韩免费观看视频| 欧美日韩国产传媒| 亚洲一区二区三区久久久| 国产精品蜜月aⅴ在线| 国产精品毛片久久| 亚洲午夜久久久久久尤物| 亚洲欧美日本国产专区一区| 欧美中文高清| 成人亚洲一区| 久久最新视频| 国产精品va视频| 91精品在线观看国产| 蜜臀精品久久久久久蜜臀| 国产精品一级在线观看| av综合电影网站| 亚洲免费在线| 久久精品亚洲| 亚洲精品在线观看91| 亚洲毛片视频| 国产精品99在线观看| 国产午夜久久| 久久精品毛片| 亚洲一区二区三区高清| 欧美日韩精品一区二区三区在线观看| 精品三级av| 久久亚洲国产精品一区二区| 国产精选一区| 国精品一区二区| 国产欧美91| 亚洲经典在线| 国产aⅴ精品一区二区三区久久| 夜夜嗨网站十八久久| 国产精品99久久免费观看| 99国产精品私拍| 精品久久97| 日韩1区2区3区| 久久精品导航| 国产精品色在线网站| 日韩午夜高潮| 国产99在线| 国产另类在线| 99国产精品自拍| av资源新版天堂在线| 日韩精品一区二区三区中文| 久久久精品五月天| 国产精品一国产精品k频道56| 亚洲欧美视频| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 中文字幕成人| 亚洲精品福利电影| 欧美一级一区| 久久av在线| 欧美二三四区| 精品一区不卡| 久久激五月天综合精品| 欧美在线综合| 日韩免费在线| 欧美激情在线精品一区二区三区| 日韩影院免费视频| 欧美日韩在线观看视频小说| 老司机免费视频一区二区三区| 涩涩涩久久久成人精品| 亚洲免费观看| 欧美精选视频一区二区| 久久精品国产久精国产爱| 青草综合视频| 亚洲18在线| 中文字幕日韩亚洲| 性色一区二区| 亚洲免费成人| 久久男女视频| 精品视频一区二区三区在线观看| 欧美日韩亚洲一区在线观看| 亚洲影视一区| 美女精品在线| 亚洲自啪免费| 中文亚洲免费| 国产亚洲高清视频| 国产精品美女久久久浪潮软件| 久久中文字幕av| 在线亚洲人成| 亚洲天堂资源| 国产 日韩 欧美一区| 日韩欧美一区二区三区在线视频| 国产精品成人一区二区不卡| 精品视频网站| 老司机精品视频在线播放| 国产精品v亚洲精品v日韩精品| 久久国内精品自在自线400部| 日韩不卡一区二区三区| 日韩高清欧美激情| 亚洲精品无吗| 日本少妇一区二区| 国产精品一区二区精品 | 在线人成日本视频| 波多视频一区| 久久久亚洲一区| 亚洲二区免费| 免费久久精品| 99国产精品| 亚洲免费毛片| 欧美一级久久| 精品日韩一区| 日韩一区电影| 免费国产自久久久久三四区久久| 麻豆9191精品国产| 日本在线观看不卡视频| 国产精品一区二区三区美女| 精品视频自拍| 久久美女性网| 视频一区视频二区中文字幕| 日本亚洲三级在线| 国产精品片aa在线观看| 国产一区三区在线播放| 久久精品国产福利| 欧美精品资源| 香蕉久久久久久久av网站| 日韩av一级片| 久久香蕉网站| 国产99久久| 中文字幕一区二区三区四区久久| 日韩av一级片| 成人国产精选| 99日韩精品| 97精品国产99久久久久久免费| 另类欧美日韩国产在线| 999久久久91| 在线精品亚洲| 国产精品一卡| 成人日韩在线| 免费在线欧美视频| 国产精品主播| 性欧美videohd高精| 久久亚洲国产精品一区二区| 国产伦理久久久久久妇女| 五月天av在线| 蜜臀久久久久久久| 精品视频高潮| 怡红院精品视频在线观看极品| 奇米亚洲欧美| 欧美日韩国产观看视频| 亚洲va久久| 天堂а√在线最新版中文在线| 亚洲欧美视频| 欧美在线黄色| 久久久久久久久久久妇女 | 国产欧美日韩精品一区二区免费| 日本在线高清| 在线观看亚洲精品福利片| 久久精品资源| aa亚洲婷婷| 精品三级av在线导航| 午夜精品网站| 欧美aⅴ一区二区三区视频| 欧美日韩第一| 老色鬼精品视频在线观看播放| 亚洲国产不卡| 国产精品一区二区中文字幕| 狠狠色狠狠色综合日日tαg| 国产欧美久久一区二区三区| 国产综合亚洲精品一区二| 国产精品久久久久77777丨| 激情五月综合网| 久久香蕉精品香蕉| 亚洲一级淫片| 人人香蕉久久| 国产精品一区二区精品| 亚洲一区久久| 日本精品不卡| 麻豆精品国产91久久久久久|