久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

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

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

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

我們一般以匿名內(nèi)部類的方式new一個Specification對象, 實(shí)現(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個實(shí)參由框架交給我們。

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

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

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

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

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

//帶條件的分頁查詢, 根據(jù)person的first_name和last_name進(jìn)行模糊查詢//為了直觀, 假設(shè)兩個字段都存在且不為空串, 省掉非空判斷和對應(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, 會顯得清爽很多, 只需定義一個抽象方法加上對應(yīng)的注解@Modifying和@Query(value='sql語句', nativeQuery=true)即可, 它還有一個好處, 不用讓封裝查詢條件這種事情跑到service層去。

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

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产乱码精品一区二区三 | 一级网站在线观看 | 91精品综合久久久久久五月天 | 91p在线观看 | 国产在线观看二区 | 在线观看成人国产 | 美女午夜影院 | av色资源 | 日韩精品久久久久久 | 久热免费在线 | 中文字幕一区在线 | 天堂√在线观看一区二区 | 欧美成人免费一级人片100 | 国产日韩精品一区二区在线观看播放 | 一区二区三区四区国产 | 一级黄色录像在线观看 | 国产中文 | 亚洲精品在线免费看 | 成人免费看| 亚洲国产精品成人综合色在线婷婷 | 亚洲一区二区在线免费观看 | 精品久久久精品 | 天天久久婷婷 | 欧美精品亚洲精品 | 美女一区二区三区在线观看 | 伊人av成人| 91精品国产自产精品男人的天堂 | 亚洲一二三区在线观看 | 九九久久久 | av在线天堂 | 久久久久久久国产精品 | av国产精品 | 精国产品一区二区三区 | 91久久久久久久 | 国产成人免费在线观看 | 操操操操操操操 | 午夜在线 | 久久亚洲精品国产精品紫薇 | 黄色大片免费网站 | 一级久久久久 | 日韩国产在线 |