成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

Spring data jpa的使用與詳解(復雜動態查詢及分頁,排序)

瀏覽:3日期:2023-08-04 14:38:37

一、 使用Specification實現復雜查詢

(1) 什么是Specification

Specification是springDateJpa中的一個接口,他是用于當jpa的一些基本CRUD操作的擴展,可以把他理解成一個spring jpa的復雜查詢接口。其次我們需要了解Criteria 查詢,這是是一種類型安全和更面向對象的查詢。而Spring Data JPA支持JPA2.0的Criteria查詢,相應的接口是JpaSpecificationExecutor。

而JpaSpecificationExecutor這個接口基本是圍繞著Specification接口來定義的,Specification接口中只定義了如下一個方法:

Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb);

Criteria查詢基本概念:

Criteria 查詢是以元模型的概念為基礎的,元模型是為具體持久化單元的受管實體定義的,這些實體可以是實體類,嵌入類或者映射的父類。

CriteriaQuery接口:

代表一個specific的頂層查詢對象,它包含著查詢的各個部分,比如:select 、from、where、group by、order by等注意:CriteriaQuery對象只對實體類型或嵌入式類型的Criteria查詢起作用。

Root:

代表Criteria查詢的根對象,Criteria查詢的查詢根定義了實體類型,能為將來導航獲得想要的結果,它與SQL查詢中的FROM子句類似。Root實例是類型化的,且定義了查詢的FROM子句中能夠出現的類型。root代表查詢的實體類,query可以從中得到root對象,告訴jpa查詢哪一個實體類,還可以添加查詢條件,還可以結合EntityManager對象 得到最終查詢的 TypedQuery對象。

CriteriaBuilder接口:

用來構建CritiaQuery的構建器對象Predicate:一個簡單或復雜的謂詞類型,其實就相當于條件或者是條件組合。 可通過 EntityManager.getCriteriaBuilder 而得。

二、使用Specification進行復雜的動態查詢

maven的依賴繼續使用上一章的就可以,這里修改一下實體類和controller層。

請求實體類:

@Datapublic class AccountRequest { //從第幾頁開始 private Integer page; //每一頁查詢多少 private Integer limit; private String id; private String name; private String pwd; private String email; private Integer[] types;}

實體類:

@Data@Entity@Table(name = 'account')@ToString@EntityListeners(AuditingEntityListener.class)public class Account { @Id @GenericGenerator(name = 'idGenerator', strategy = 'uuid') @GeneratedValue(generator = 'idGenerator') private String id; @Column(name = 'username', unique = true, nullable = false, length = 64) private String username; @Column(name = 'password', nullable = false, length = 64) private String password; @Column(name = 'email', length = 64) private String email; @Column(name = 'type') private Short type; @CreatedDate @Column(name = 'create_time', nullable = false) private LocalDateTime createTime;}

Repository層:

public interface AccountRepository extends JpaRepository<Account,String>, JpaSpecificationExecutor<Account> {}

controller層(還是直接略過service層)

@Autowired private AccountRepository repository; @PostMapping('/get') public List<Account> get(@RequestBody AccountRequest request){ Specification<Account> specification = new Specification<Account>() { @Override public Predicate toPredicate(Root<Account> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder builder) {//所有的斷言 及條件List<Predicate> predicates = new ArrayList<>();//精確匹配id pwdif (request.getId() != null) { predicates.add(builder.equal(root.get('id'), request.getId()));}if (request.getPwd() != null) { predicates.add(builder.equal(root.get('password'), request.getPwd()));}//模糊搜索 nameif (request.getName() != null && !request.getName().equals('')) { predicates.add(builder.like(root.get('username'), '%' + request.getName() + '%'));}if (request.getEmail() != null && !request.getEmail().equals('')) { predicates.add(builder.like(root.get('email'), '%' + request.getEmail() + '%'));}//in范圍查詢if (request.getTypes() != null) { CriteriaBuilder.In<Object> types = builder.in(root.get('type')); for (Integer type : request.getTypes()) { types = types.value(type); } predicates.add(types);}return builder.and(predicates.toArray(new Predicate[predicates.size()])); } }; List<Account> accounts = repository.findAll(specification); return accounts; }

通過重寫Specification的toPredicate的方法,這樣一個復雜的動態sql查詢就完成了,通過post請求直接就可以調用了。

三、分頁及排序

@PostMapping('/page') public List<Account> getPage(@RequestBody AccountRequest request){ Specification<Account> specification = new Specification<Account>() { @Override public Predicate toPredicate(Root<Account> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {List<Predicate> predicates = new ArrayList<>();//do anythingreturn criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])); } }; //表示通過createTime進行 ASC排序 PageRequest page = new PageRequest(request.getPage() - 1, request.getLimit(), Sort.Direction.ASC, 'createTime'); Page<Account> pageInfo = repository.findAll(specification, page); return pageInfo.getContent(); }

上面的代碼是在經過復雜查詢并進行分頁與排序,通過PageRequest來構建分頁排序的規則。傳入起始頁及每頁的數量,還有排序的規則及以哪個屬性排序。jpa中是以第0頁開始的,所以傳參的時候需要注意!

當然,如果你不需要進行復雜的查詢也可以對數據進行分頁及排序查詢。

修改repository,使其繼承PagingAndSortingRepository。

@Repositorypublic interface AccountRepository extends JpaRepository<Account,String>, JpaSpecificationExecutor<Account> , PagingAndSortingRepository<Account,String> { Page<Account> findByAge(int age, Pageable pageable);}

使用時先創建pageable參數,然后傳進去就可以了。

//顯示第1頁每頁顯示3條PageRequest pr = new PageRequest(1,3);//根據年齡進行查詢Page<Account> stus = accountPageRepository.findByAge(22,pr);

排序也是一樣的,在repository中創建方法

List<Account> findByPwd(String pwd, Sort sort);

調用的時候傳入sort對象

//設置排序方式為username降序List<Account> accs = accountPageRepository.findByAge('123456',new Sort(Sort.Direction.DESC,'username'));//設置排序以username和type進行升序acc = accountPageRepository.findByAge('123456',new Sort(Sort.Direction.ASC,'username','type'));//設置排序方式以name升序,以address降序Sort sort = new Sort(new Sort.Order(Sort.Direction.ASC,'name'),new Sort.Order(Sort.Direction.DESC,'type'));accs = accountPageRepository.findByAge('123456',sort);

到此這篇關于Spring data jpa的使用與詳解(復雜動態查詢及分頁,排序)的文章就介紹到這了,更多相關Spring data jpa內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美日韩在线播放三区四区| 制服丝袜中文字幕亚洲| 国产一区二区三区久久久久久久久 | 亚洲精品第一国产综合野| 91在线视频在线| 在线不卡的av| 韩国精品主播一区二区在线观看| 国产亚洲一级| 亚洲欧美一区二区在线观看| 91免费版pro下载短视频| 日韩美一区二区三区| 久久99国产精品成人| 久久综合久久综合这里只有精品| 国产精品久久久久久亚洲伦| 国产精品123| 欧美日韩二区三区| 国内久久精品视频| 欧美丝袜第三区| 蜜桃久久av一区| 亚洲一区二区黄色| 亚洲高清激情| 136国产福利精品导航| 一区精品久久| 1区2区3区国产精品| 亚洲高清二区| 一区二区三区四区中文字幕| 亚洲精品在线免费| 国产精品午夜电影| 国产精品xxx在线观看www| 国产婷婷色一区二区三区四区| jlzzjlzz亚洲日本少妇| 精品免费日韩av| 成人av手机在线观看| 久久综合精品国产一区二区三区| 成人永久aaa| 精品第一国产综合精品aⅴ| 99视频精品全部免费在线| 久久午夜老司机| 欧美视频观看一区| 亚洲视频在线观看三级| 国产日韩一区二区三区在线播放 | 国产精品免费一区二区三区在线观看 | 制服丝袜国产精品| 国产99久久久精品| 久久久久高清精品| 在线播放不卡| 午夜精品一区二区三区免费视频| 色婷婷av一区二区三区gif| 美日韩黄色大片| 3d成人动漫网站| www.久久精品| 国产欧美一区二区精品久导航 | 一本高清dvd不卡在线观看| 日韩和欧美一区二区三区| 欧洲精品在线观看| 激情另类小说区图片区视频区| 91精品婷婷国产综合久久 | 亚洲视频 欧洲视频| 亚洲欧美成人综合| 久久国产精品露脸对白| 日韩一区二区三区视频| 欧美在线网站| 亚洲综合色视频| 欧美系列在线观看| 风间由美中文字幕在线看视频国产欧美| 精品电影一区二区三区| 黄色亚洲免费| 五月天欧美精品| 欧美一区二区三区视频在线| 91一区二区三区在线播放| 亚洲欧洲中文日韩久久av乱码| 国产精品久久久一区二区| 日韩精品三区四区| 欧美精品成人一区二区三区四区| 波多野结衣在线一区| 亚洲欧美日韩中文字幕一区二区三区| 色偷偷一区二区三区| 国产.精品.日韩.另类.中文.在线.播放| 欧美精品一区二区不卡| 91久久夜色精品国产九色| 视频一区二区不卡| 精品国产麻豆免费人成网站| 18成人免费观看视频| 久久99这里只有精品| 国产欧美一区二区三区鸳鸯浴 | 2023国产精品自拍| 一区二区三区四区五区视频 | 韩国亚洲精品| 三级一区在线视频先锋| 制服丝袜中文字幕亚洲| 亚洲婷婷在线| 久久国产欧美日韩精品| 国产精品免费av| 欧美在线999| 色综合久久中文综合久久牛| 欧美亚洲禁片免费| 99精品国产热久久91蜜凸| 亚洲尤物视频在线| 日韩欧美国产小视频| 亚洲黄色高清| 国产精品一区一区三区| 亚洲美女在线一区| 欧美一区午夜视频在线观看| 亚洲无线一线二线三线区别av| 日本 国产 欧美色综合| 国产拍欧美日韩视频二区| 在线观看国产日韩| 国内一区二区三区在线视频| 久久国产精品99久久人人澡| 亚洲国产精品成人综合| 91精彩视频在线| 欧美日韩国产成人精品| 中文字幕欧美日韩一区| 久久亚洲精选| 欧美连裤袜在线视频| 精品一区二区综合| 亚洲综合视频网| 久久久午夜电影| 欧美中文字幕一区二区三区 | 一本在线高清不卡dvd| 午夜国产精品视频| 久久国产福利国产秒拍| 亚洲免费大片在线观看| 日韩一区二区三区视频在线观看| 国产精品呻吟| 欧美一区精品| 国产一区二区伦理片| 视频在线观看91| 中文字幕一区二区三区在线播放 | 欧美一区二区三区啪啪| 久久精品中文| 欧美特黄一区| 国产99久久久精品| 美女视频黄免费的久久| 亚洲精品欧美综合四区| 欧美国产日韩精品免费观看| 欧美一区二区视频在线观看| 久久久久久亚洲精品杨幂换脸| 欧美日本国产| 成人性生交大片免费看视频在线 | 亚洲国产精品一区二区尤物区| 国产欧美日韩在线看| 日韩一区二区免费在线电影| 久久综合久久久| 亚洲欧洲在线一区| 欧美日韩国产一区精品一区| 成人美女在线观看| 国模套图日韩精品一区二区| 婷婷综合在线观看| 亚洲人成网站在线| 国产亚洲欧美一区在线观看| 欧美一区二区三区啪啪| 欧美日韩在线三区| 麻豆精品91| 亚洲伦伦在线| 欧美人成网站| 欧美一区精品| 91尤物视频在线观看| 成人国产精品免费观看动漫| 久久爱另类一区二区小说| 日韩影院免费视频| 亚洲激情第一区| 国产精品你懂的在线| 国产性天天综合网| 久久久99久久精品欧美| 精品国产区一区| 日韩欧美一级二级| 欧美人xxxx| 精品视频999| 欧美性猛片aaaaaaa做受| 香蕉成人久久| 国产九九精品| 亚洲国产mv| 伊人影院久久| 欧美激情第六页| 91麻豆自制传媒国产之光| 欧美一区二区三区在线免费观看| proumb性欧美在线观看| av成人老司机| 91亚洲精品久久久蜜桃网站| 丁香婷婷综合色啪| 国产成人精品一区二| 国产69精品久久久久777| 国产成人av电影免费在线观看| 国产乱一区二区| 国产成人综合自拍| 懂色av噜噜一区二区三区av| 成人av网站在线| 91免费看`日韩一区二区| 91免费看片在线观看| 91社区在线播放| 欧美午夜一区| 在线视频成人| 老鸭窝91久久精品色噜噜导演| 国产精品一区免费观看| 国产精品一二| 久久亚洲精品欧美| 欧美亚洲国产bt| 欧美日韩高清一区| 精品国产凹凸成av人网站|