jpa自定義條件分頁查詢


主要依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

這里以我最近自己瞎折騰的項目部分代碼為例子(僅展示主要部分):

實體類名稱(Confusion)

需要注意的是

類上+ @Entity

主鍵字段+ @Id

 

package cn.zytao.taosir.disabuse.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import cn.zytao.taosir.common.model.disabuse.Confusion;

public interface ConfusionRepository extends JpaRepository<Confusion,String>, JpaSpecificationExecutor<Confusion>{
}

 

JpaRpository這里就不多講了,需要注意的是,同時繼承JpaSpecificationExecutor

我們發現,繼承該類后,可以使用相關的API

T findOne(Specification<T> spec);

List<T> findAll(Specification<T> spec);

Page<T> findAll(Specification<T> spec, Pageable pageable);

List<T> findAll(Specification<T> spec, Sort sort);

long count(Specification<T> spec);

注意Specification類 

通過源碼可以發現這個方法,關鍵就是重寫它了

在Service層中

    @SuppressWarnings({ "deprecation", "serial" })
    @Override
    public Page<Confusion> findByPageAndParams(Confusion params, int pageNumber, int pageSize) {
        Pageable pageable = new PageRequest(pageNumber, pageSize);
        Specification<Confusion> confusion=new Specification<Confusion>() {
            @Override
            public Predicate toPredicate(Root<Confusion> root, CriteriaQuery<?> query,
                    CriteriaBuilder criteriaBuilder) {
                Path<String> theme = root.get("theme");
                return criteriaBuilder.like(theme, "%"+params.getTheme()+"%");
            }
        };
        return confusionRepository.findAll(confusion, pageable);
    }

如果使用的springboot是2.0X以上的版本,new PageRequest的構造方法已經過時,推薦使用

Pageable pageable = PageRequest.of(pageNumber, pageSize);

以上僅做參考,CriteribBuilder用於構造自定義的查詢條件(即條件構造器)

 

通過相關的方法,我們可以用集合來處理多條件的查詢,例子

    @Override
    public JSONObject list(Integer page, Integer size, String remark,Integer method,Integer status) {
        Pageable pageable = PageRequest.of(page-1, size);
        Specification<Authority> authorityQuery=new Specification<Authority>() {
            @Override
            public Predicate toPredicate(Root<Authority> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                List<Predicate> predicates=new ArrayList<>();
                if(remark!=null)
                    predicates.add(criteriaBuilder.like(root.get("remark"), "%"+remark+"%"));
                if(method!=null)
                    predicates.add(criteriaBuilder.equal(root.get("method"), method));
                if(status!=null)
                    predicates.add(criteriaBuilder.equal(root.get("status"), status));
                return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        };
        Page<Authority> pageAuthority = authorityMapper.findAll(authorityQuery, pageable);
        return ActionHelper.responseOk(pageAuthority.getContent());
    }
多條件的例子

控制層

    public JSONObject findByParamAndPage(@RequestBody Confusion confusion, int pageNumber, int pageSize) {
        Page<Confusion> result = confusionService.findByPageAndParams(confusion, pageNumber, pageSize);
        JSONObject data=new JSONObject();
        data.put("content", result.getContent());
        data.put("totalNums", result.getTotalElements());
        data.put("totalPages",result.getTotalPages());
        return ActionHelper.responseOk(data);
    }

因為這里我的項目使用的是分布式的一個實現方式,所以這里不提供@RequestMapping,自行編寫

下面看看在swagger2下的效果。

 

 

 

 

 

 


免責聲明!

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



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