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

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

Spring Data JPA帶條件分頁查詢實現原理

瀏覽:127日期: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接口, 由框架生成代理類來完成具體的調用, 而不用自己寫daoImpl實現類, 因為這兩個接口自帶了很多方法, 如果我們寫實現類會發現一上來就需要實現十來個方法, 比較麻煩。

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

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

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

我們一般以匿名內部類的方式new一個Specification對象, 實現其中的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對象調用get()方法得到。如果有多個篩選條件, 調用criteriaBuilder的and、or等方法連接起來, 一般是鏈式調用的形式。

舉個簡單的實際例子:

//帶條件的分頁查詢, 根據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的語法了, 很多開發者也經常在dao接口中直接寫SQL語句來讓框架查詢, 使用起來感覺有點類似MyBatis, 會顯得清爽很多, 只需定義一個抽象方法加上對應的注解@Modifying和@Query(value='sql語句', nativeQuery=true)即可, 它還有一個好處, 不用讓封裝查詢條件這種事情跑到service層去。

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

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久这里只有精品一区二区| 国产精品毛片一区二区在线看| 日韩成人精品一区| 国产精品男女| 国产精品视频首页| 欧美在线91| 国产精品亚洲一区二区三区在线观看| 久久久亚洲欧洲日产| 蜜桃久久久久| 国产不卡一区| 成人在线网站| 不卡中文一二三区| 亚洲深夜影院| 亚洲涩涩av| 久久影视一区| 亚洲自啪免费| 日韩欧美美女在线观看| 欧美在线看片| 国产精品自拍区| 国产精久久久| 久久精品福利| 欧美亚洲日本精品| 亚洲成人不卡| 欧美不卡高清| 日本欧洲一区二区| 国产亚洲久久| 国产99在线| 欧美日韩激情| 亚洲综合中文| 久久a爱视频| 神马久久午夜| 99综合视频| 日本不卡视频一二三区| 国产精品久久久久av蜜臀| 国精品产品一区| 国产精品日本欧美一区二区三区| 中文在线一区| 91福利精品在线观看| 久久精品伊人| 99精品视频在线观看免费播放| 国产视频一区欧美| 国产乱子精品一区二区在线观看 | 免费看日韩精品| 国产精品中文| 久久精品免费一区二区三区 | 精品欧美久久| 欧美日韩1区2区3区| 成人午夜网址| 日韩午夜在线| 国产精品一区二区三区美女| 蜜桃精品在线| 日韩精品视频在线看| 理论片午夜视频在线观看| 狠狠色狠狠色综合日日tαg| 欧美一区免费| 欧美日韩中文字幕一区二区三区| 亚洲三级毛片| 欧美日韩国产观看视频| 日本伊人午夜精品| 久久久久国产一区二区| 91精品国产一区二区在线观看| 久久久久国产精品一区三寸| 日本国产亚洲| 日韩专区一卡二卡| 97精品国产福利一区二区三区| 三级一区在线视频先锋| 亚洲美女久久精品| 91精品福利观看| 欧美二区视频| 久久av综合| 国产视频欧美| 伊人久久国产| 国产免费久久| 亚洲一区二区三区免费在线观看| 麻豆高清免费国产一区| 99亚洲精品| 成人啊v在线| 国产伦一区二区三区| 午夜在线一区二区| 里番精品3d一二三区| 综合一区av| 国精品一区二区三区| 麻豆精品av| 日韩一区二区三区精品| 黄色免费成人| 亚洲成人av观看| 成人在线观看免费视频| 欧美视频精品全部免费观看| 午夜在线观看免费一区| 久久美女精品| 91青青国产在线观看精品| 欧美一级一区| 中文视频一区| 欧美午夜不卡| 久久亚洲在线| 欧美sss在线视频| 欧美日韩在线网站| 日韩综合精品| 国内精品伊人| 久久av超碰| 国产调教精品| 日韩av中文字幕一区二区| 免费日韩av片| 91高清一区| 久久国产主播| 久久国产毛片| 久久精品91| 日韩在线二区| 亚洲黄色网址| 日本一二区不卡| 国产一区二区三区国产精品| 麻豆久久一区| 麻豆视频久久| 国产精品久久久久久模特 | 久久精品亚洲| 精品一区av| 久久91视频| 久久精品国产久精国产爱| 捆绑调教美女网站视频一区| 欧美精品成人| 国产欧美一区二区精品久久久 | 欧美天堂一区| 国产欧美激情| 欧美aⅴ一区二区三区视频| 国产调教精品| 国产精品porn| 久久成人av| 国产成人精品亚洲线观看| 精品视频久久| 激情久久99| 成人精品亚洲| 2023国产精品久久久精品双| 亚洲欧美日韩国产| 日韩中文字幕| 国产欧美69| 精品久久免费| 日韩在线二区| 尤物精品在线| 亚洲精品看片| 国产毛片精品| 都市激情国产精品| 群体交乱之放荡娇妻一区二区| 99tv成人| 日韩专区欧美专区| 日本亚洲欧美天堂免费| 欧美一区二区三区久久精品| 国产精品免费精品自在线观看| 麻豆国产欧美一区二区三区| 日本不卡免费高清视频在线| 亚洲二区免费| 亚洲天堂av资源在线观看| 青草综合视频| 国产成人精选| 欧美日韩一区二区综合| 久久精品国产68国产精品亚洲| 久久久亚洲欧洲日产| 国产精东传媒成人av电影| 精品美女视频| 免费不卡中文字幕在线| 亚洲精品一区二区在线看| 噜噜噜久久亚洲精品国产品小说| 亚洲精品影视| 精品视频久久| 婷婷综合在线| 日韩精品高清不卡| 精品一区二区三区四区五区| 色综合www| 蜜臀久久99精品久久久久久9| 欧美日韩亚洲一区三区| 97人人精品| 国产精品女主播一区二区三区| 欧美一区二区三区久久| 欧美日韩免费看片| 一区二区精彩视频| 国产福利一区二区三区在线播放| 日韩黄色大片| 在线精品亚洲| 国产不卡一区| 天堂av在线一区| 国产精品一级| 免费福利视频一区二区三区| 性一交一乱一区二区洋洋av| 国产日韩亚洲| 久久高清精品| 久久国内精品| 久久久9色精品国产一区二区三区| 亚洲精品九九| 亚洲黄色免费av| 亚洲午夜国产成人| 国产精品99久久精品| 国产精品嫩草99av在线| 麻豆国产91在线播放| 六月天综合网| 在线看片国产福利你懂的| 久热综合在线亚洲精品| 精品中文字幕一区二区三区四区| 日韩午夜一区| www.51av欧美视频| 久久精品av麻豆的观看方式| 91成人超碰|