Spring Data Jpa之高級查詢(jpa-spec插件)


友情鏈接:Spring Data Jpa的動態查詢庫 https://github.com/wenhao/jpa-spec

功能介紹

  1. 兼容Spring Data Jpa 和JPA2.1接口。
  2. Equal/NotEqual/Like/NotLike/In/NotIn支持可變參數, Equal/NotEqual 支持空(Null)值。
  3. 每個條件支持關聯查詢。
  4. 支持自定義條件查詢。
  5. 條件構建器。
  6. 支持分頁和排序。

導包:

<dependency>
  <groupId>com.github.wenhao</groupId>
  <artifactId>jpa-spec</artifactId>
  <version>3.1.1</version>
  <!-- 把所有依賴都過濾 -->
  <exclusions>
    <exclusion>
      <groupId>*</groupId>
      <artifactId>*</artifactId>
    </exclusion>
  </exclusions>
</dependency>

詳細的使用文檔:

https://github.com/wenhao/jpa-spec/blob/master/docs/3.1.0_cn.md

https://www.w3cschool.cn/jpaspec/

思路分析:

1 用戶傳的數據有0-n個

2 所以要准備一個對象接收用戶傳過來的數據==》Query對象

3 分頁的條件對我們來說也是封裝到Query對象中的

Query對象(抽個父類):

public abstract class BaseQuery {
    private int currentPage=1;
    private int currentSize=10;
    private boolean sort = true;
    private String sortByColumn;
    //寫成抽象類,子類必須實現
    public abstract Specification getSpecification();
    //分頁加排序
    public Pageable getPageable(){
        Pageable pageRequest =new PageRequest(currentPage, currentSize);
        if (sortByColumn!=null&&!"".equals(sortByColumn)){
            if (sort){
                Sort sort = new Sort(Sort.Direction.ASC,sortByColumn);
                pageRequest = new PageRequest(currentPage, currentSize,sort);
                return pageRequest;
            }
            Sort sort = new Sort(Sort.Direction.DESC,sortByColumn);
            pageRequest = new PageRequest(currentPage, currentSize,sort);
            return pageRequest;
        }
        return pageRequest;
    }
    //拿到排序
    public Sort getSort(){
        if (sortByColumn!=null&&!"".equals(sortByColumn)){
            if (sort){
                Sort sort = new Sort(Sort.Direction.ASC,sortByColumn);
                return sort;
            }
            Sort sort = new Sort(Sort.Direction.DESC,sortByColumn);
            return sort;
        }
        return null;
    }
    提供相應的getter,setter
}

具體的query對象(以員工查詢為例):

public class EmployeeQuery extends BaseQuery{
    private String username;
    private String email;
    private Integer age;
    private Long departmentId;
    @Override
    public Specification getSpecification() {
        Specification<Employee> spec = Specifications.<Employee>and()
                .like(StringUtils.isNotBlank(username),"username", "%"+username+"%")
                .like(StringUtils.isNotBlank(email),"email", "%"+email+"%")
                .ge(age !=null,"age",age)
                .eq(departmentId!=null,"departmentId.id",departmentId)
                .build();
        return spec;
    }
    getter,setter
}    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM