亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2020年11月01日 09:42:01   作者:耶亞希  
這篇文章主要介紹了Spring data jpa的使用與詳解(復(fù)雜動(dòng)態(tài)查詢及分頁(yè),排序),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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

(1) 什么是Specification

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

而JpaSpecificationExecutor這個(gè)接口基本是圍繞著Specification接口來(lái)定義的,Specification接口中只定義了如下一個(gè)方法:

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

Criteria查詢基本概念:

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

CriteriaQuery接口:

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

Root:

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

CriteriaBuilder接口:

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

二、使用Specification進(jìn)行復(fù)雜的動(dòng)態(tài)查詢

maven的依賴?yán)^續(xù)使用上一章的就可以,這里修改一下實(shí)體類和controller層。

請(qǐng)求實(shí)體類:

@Data
public class AccountRequest {

  //從第幾頁(yè)開始
  private Integer page;

  //每一頁(yè)查詢多少
  private Integer limit;

  private String id;

  private String name;

  private String pwd;

  private String email;

  private Integer[] types;

}

實(shí)體類:

@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層(還是直接略過(guò)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 pwd
        if (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()));
        }
        //模糊搜索 name
        if (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;
  }

通過(guò)重寫Specification的toPredicate的方法,這樣一個(gè)復(fù)雜的動(dòng)態(tài)sql查詢就完成了,通過(guò)post請(qǐng)求直接就可以調(diào)用了。

三、分頁(yè)及排序

@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 anything
        return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
      }
    };
    //表示通過(guò)createTime進(jìn)行 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)過(guò)復(fù)雜查詢并進(jìn)行分頁(yè)與排序,通過(guò)PageRequest來(lái)構(gòu)建分頁(yè)排序的規(guī)則。傳入起始頁(yè)及每頁(yè)的數(shù)量,還有排序的規(guī)則及以哪個(gè)屬性排序。jpa中是以第0頁(yè)開始的,所以傳參的時(shí)候需要注意!

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

修改repository,使其繼承PagingAndSortingRepository。

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

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

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

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

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

調(diào)用的時(shí)候傳入sort對(duì)象

//設(shè)置排序方式為username降序
List<Account> accs = accountPageRepository.findByAge("123456",new Sort(Sort.Direction.DESC,"username"));
//設(shè)置排序以u(píng)sername和type進(jìn)行升序
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ù)雜動(dòng)態(tài)查詢及分頁(yè),排序)的文章就介紹到這了,更多相關(guān)Spring data jpa內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Springboot使用logback的注意事項(xiàng)

    基于Springboot使用logback的注意事項(xiàng)

    這篇文章主要介紹了Springboot使用logback的注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Servlet連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)用戶登錄的實(shí)現(xiàn)示例

    Servlet連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)用戶登錄的實(shí)現(xiàn)示例

    本文主要介紹了Servlet連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)用戶登錄的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 詳解JAVA中的Collection接口和其主要實(shí)現(xiàn)的類

    詳解JAVA中的Collection接口和其主要實(shí)現(xiàn)的類

    這篇文章主要介紹了JAVA中的Collection接口和其主要實(shí)現(xiàn)的類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • SpringBoot 集成 Nebula的操作過(guò)程

    SpringBoot 集成 Nebula的操作過(guò)程

    這篇文章主要介紹了SpringBoot 集成 Nebula的操作過(guò)程,通過(guò)示例代碼介紹了java 環(huán)境下如何對(duì) Nebula Graph 進(jìn)行操作,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Spring BPP中如何優(yōu)雅的創(chuàng)建動(dòng)態(tài)代理Bean詳解

    Spring BPP中如何優(yōu)雅的創(chuàng)建動(dòng)態(tài)代理Bean詳解

    這篇文章主要給大家介紹了關(guān)于Spring BPP中如何優(yōu)雅的創(chuàng)建動(dòng)態(tài)代理Bean的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • java生成驗(yàn)證碼圖片的方法

    java生成驗(yàn)證碼圖片的方法

    這篇文章主要為大家詳細(xì)介紹了java生成驗(yàn)證碼圖片的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • Hadoop之NameNode Federation圖文詳解

    Hadoop之NameNode Federation圖文詳解

    今天小編就為大家分享一篇關(guān)于Hadoop之NameNode Federation圖文詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Spring中的Sentinel熔斷降級(jí)原理詳解

    Spring中的Sentinel熔斷降級(jí)原理詳解

    這篇文章主要介紹了Spring中的Sentinel熔斷降級(jí)原理詳解,熔斷是為了起到保護(hù)作用,如果某個(gè)目標(biāo)服務(wù)調(diào)用比較慢或者大量的超時(shí),這個(gè)時(shí)候如果觸發(fā)熔斷機(jī)制,則可以保證后續(xù)的請(qǐng)求不會(huì)繼續(xù)發(fā)送到目標(biāo)服務(wù)上,而是直接返回降級(jí)的邏輯并且快速釋放資源,需要的朋友可以參考下
    2023-09-09
  • spring?boot項(xiàng)目中集成rocketmq詳細(xì)步驟

    spring?boot項(xiàng)目中集成rocketmq詳細(xì)步驟

    這篇文章主要給大家介紹了關(guān)于spring?boot項(xiàng)目中集成rocketmq的相關(guān)資料,springboot集成rocketmq的方法非常簡(jiǎn)單,文中直接上代碼,需要的朋友可以參考下
    2023-09-09
  • 關(guān)于Jsoup將相對(duì)路徑轉(zhuǎn)為絕對(duì)路徑的方法

    關(guān)于Jsoup將相對(duì)路徑轉(zhuǎn)為絕對(duì)路徑的方法

    這篇文章主要介紹了關(guān)于Jsoup將相對(duì)路徑轉(zhuǎn)為絕對(duì)路徑的方法,jsoup 是一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容,需要的朋友可以參考下
    2023-04-04

最新評(píng)論