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

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

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

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

一、 使用Specification實現(xiàn)復(fù)雜查詢

(1) 什么是Specification

Specification是springDateJpa中的一個接口,他是用于當(dāng)jpa的一些基本CRUD操作的擴展,可以把他理解成一個spring jpa的復(fù)雜查詢接口。其次我們需要了解Criteria 查詢,這是是一種類型安全和更面向?qū)ο蟮牟樵?。而Spring Data JPA支持JPA2.0的Criteria查詢,相應(yīng)的接口是JpaSpecificationExecutor。

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

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

Criteria查詢基本概念:

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

CriteriaQuery接口:

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

Root:

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

CriteriaBuilder接口:

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

二、使用Specification進行復(fù)雜的動態(tài)查詢

maven的依賴?yán)^續(xù)使用上一章的就可以,這里修改一下實體類和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的方法,這樣一個復(fù)雜的動態(tài)sql查詢就完成了,通過post請求直接就可以調(diào)用了。

三、分頁及排序

@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(); }

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

當(dāng)然,如果你不需要進行復(fù)雜的查詢也可以對數(shù)據(jù)進行分頁及排序查詢。

修改repository,使其繼承PagingAndSortingRepository。

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

使用時先創(chuàng)建pageable參數(shù),然后傳進去就可以了。

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

排序也是一樣的,在repository中創(chuàng)建方法

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

調(diào)用的時候傳入sort對象

//設(shè)置排序方式為username降序List<Account> accs = accountPageRepository.findByAge('123456',new Sort(Sort.Direction.DESC,'username'));//設(shè)置排序以username和type進行升序acc = accountPageRepository.findByAge('123456',new Sort(Sort.Direction.ASC,'username','type'));//設(shè)置排序方式以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);

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

標(biāo)簽: Spring
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费看一区二区三区| 青草久久视频| 欧美激情91| 日韩欧美久久| 亚洲一区二区日韩| 美女久久一区| 亚洲一区二区三区免费在线观看 | 激情亚洲影院在线观看| 免费看一区二区三区| 国产精品一区二区免费福利视频| 日本va欧美va瓶| 在线视频亚洲欧美中文| 在线精品观看| 综合一区av| 日韩三级一区| 国产欧美日韩在线观看视频| 国产精品chinese| 久久免费福利| 麻豆国产一区| 国产精品国码视频| 免费日韩一区二区三区| 久久精品一区二区国产| 亚洲h色精品| 免费av一区| 欧美综合二区| 69堂免费精品视频在线播放| 国产精品久久久久久久久久久久久久久 | 日韩欧美另类一区二区| 国产精品二区不卡| 亚洲午夜黄色| 亚洲天堂av资源在线观看| 欧美日韩亚洲一区三区| 国产一区二区三区网| 久久久一二三| 日韩中文字幕麻豆| 日韩激情一区二区| 国产精品99视频| 999国产精品999久久久久久| 久久不射网站| 国产日韩欧美在线播放不卡| 国产精品毛片久久| 日韩高清不卡| 视频一区国产视频| 老司机精品视频网| 亚洲国内精品| 日韩超碰人人爽人人做人人添| 国产精品麻豆成人av电影艾秋| 国产一区二区三区四区大秀| 激情黄产视频在线免费观看| 日韩中文在线电影| 日日摸夜夜添夜夜添国产精品| 欧美日韩a区| 国产一区二区三区四区五区| 亚洲va在线| 国产美女一区| 欧美日一区二区三区在线观看国产免| 日本精品在线播放| 国产精品香蕉| 免费福利视频一区二区三区| 亚洲高清av| 久久久一本精品| 久久av一区| 国产欧美日韩视频在线| 免费看久久久| 在线日韩一区| 亚洲a级精品| 麻豆中文一区二区| 日韩精品免费一区二区三区| 不卡一区2区| 首页国产欧美日韩丝袜| 国产日韩欧美一区在线| 国产精品网站在线看| av免费不卡国产观看| 国产模特精品视频久久久久| 国产欧美一区二区精品久久久 | 国产精品一区二区三区四区在线观看 | 在线看片日韩| 国产精品3区| 亚洲va在线| 日韩高清不卡一区二区| 国产传媒在线观看| 亚洲激情欧美| 国产精品久久久久9999高清| 亚洲大片在线| 国产精品一区三区在线观看| 日韩伦理在线一区| 蜜桃传媒麻豆第一区在线观看| 欧美一级网址| 久久不卡国产精品一区二区| 精品99久久| 午夜精品婷婷| 久久久精品区| 石原莉奈一区二区三区在线观看 | 亚洲伊人精品酒店| 国产精品二区不卡| 亚洲bt欧美bt精品777| 国产不卡人人| 综合一区av| 国产私拍福利精品视频二区| 99久久久久| 国产精品一区亚洲| 亚洲精品一二三区区别| 国产精品久久777777毛茸茸| 国产精品蜜芽在线观看| 国产精品对白| 欧美伊人久久| 麻豆mv在线观看| 国产精品黄色片| 视频一区在线视频| 欧美aa在线观看| 青草av.久久免费一区| 久久精品官网| 美女国产一区二区三区| 91精品成人| 国产一区三区在线播放| 欧美日韩一区二区三区不卡视频| 欧美特黄一区| 黑森林国产精品av| 国产欧美日韩视频在线| 日韩制服丝袜av| 午夜精品成人av| 欧美激情综合| 日韩av网站在线免费观看| 一区免费在线| 精品亚洲免a| 涩涩涩久久久成人精品| 成人av二区| 精品捆绑调教一区二区三区| 国产精品v日韩精品v欧美精品网站 | 91成人精品视频| 亚洲精品成人图区| 国产精品乱战久久久| 亚洲欧洲美洲国产香蕉| 一区二区亚洲精品| 美女少妇全过程你懂的久久| 九九九精品视频| 日本少妇精品亚洲第一区| 中文在线一区| 狠狠久久婷婷| 精品美女久久| 欧美精品不卡| 国产精品**亚洲精品| 日本中文字幕不卡| 亚洲作爱视频| 久久亚洲色图| 亚洲一区欧美二区| 亚洲一本视频| 999久久久亚洲| 久久精品欧美一区| 日韩一区三区| 日韩精品麻豆| 国产精品成久久久久| 精品免费av一区二区三区| 欧美激情 亚洲a∨综合| 青青草91久久久久久久久| 日韩国产欧美一区二区三区| 日韩欧美2区| 亚洲精品看片| 青草久久视频| 国产精品2区| 精品国产乱码久久久| 日本不卡免费高清视频在线| 日韩不卡在线| 91精品观看| 视频在线观看一区二区三区| 男女性色大片免费观看一区二区 | 欧美日韩a区| 久久丁香四色| 精品久久久久中文字幕小说| 国产精品大片| 日本91福利区| 国产另类在线| 久久精品国产亚洲aⅴ| 精品国产a一区二区三区v免费| 久久精品亚洲| 国产色播av在线| 精品国产一级| 久久久蜜桃一区二区人| 午夜精品网站| 天堂va蜜桃一区二区三区| 日韩中文字幕av电影| 日韩国产高清在线| 欧美国产日本| 秋霞影院一区二区三区| 亚洲精品福利电影| 蜜桃tv一区二区三区| 免费在线观看精品| 日韩高清不卡在线| 久久av影院| 欧美羞羞视频| 91久久在线| 一区免费视频| 石原莉奈在线亚洲二区| 亚洲三级网址| 亚洲精一区二区三区| 日韩精品久久理论片| 国产成人免费av一区二区午夜| 欧美羞羞视频| 蜜臀av亚洲一区中文字幕| 国产九一精品|