JPA分頁查詢與條件分頁查詢


情有獨鍾的JPA

平時在寫一些小項目時,比較喜歡引用 Spring Data Jpa,其實還是圖他寫代碼快~
在日常的開發工作中,分頁列表查詢基本是隨處可見,下面一起看一下如何使用 jpa 進行多條件查詢以及查詢列表分頁呢?

關於JPA的使用

關於 jpa 的使用,下面2步簡單過一下,詳細資料,小伙伴自行搜索一下吧~

1、導入依賴
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    mysql、web、druid......
</dependency>
2、配置yml

圖方便直接貼代碼了:

spring:
  # 數據源
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/tmax?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 1234
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.jdbc.Driver
  jpa:
    # 操作數據庫時顯示sql語句
    show-sql: true
    # 自動生成表結構
    generate-ddl: true
    hibernate:
      ddl-auto: none
    database-platform: org.hibernate.dialect.MySQL57Dialect

分頁查詢

我們了解 jpa 基本是不用去寫 sql 的,繼承 JpaRepository 即可,同樣也提供給了我們分頁查詢的方法,「補充:使用分頁需要同時繼承JpaSpecificationExecutor

舉例:

Page<VideoCategory> findByCondition(SearchVo searchVo, Pageable pageable);

通過傳入一個遵循 pageale 協議的對象來獲取某一頁的數據,通過源碼查看,發現 Pageable 是一個接口,提供了分頁一組方法的聲明,如第幾頁,每頁多少條記錄,排序信息等,部分方法如下:

int getPageNumber();

int getPageSize();

int getOffset();

Sort getSort();

Pageable next();

Pageable previousOrFirst();

Pageable first();

boolean hasPrevious();

通過這些方法我們可以構造我們的 pageable 對象,需要注意的是 jpa 在構造頁碼初始時,是從 0 開始的。

廢話不多說,來看一段代碼吧:

1. impl
    @Override
    public Page<VideoCategory> findByCondition(VideoCategory videoCategory, SearchVo searchVo, Pageable pageable
{

        return videoCategoryDao.findAll(new Specification<VideoCategory>() {
            @Nullable
            @Override
            public Predicate toPredicate(Root<VideoCategory> root, CriteriaQuery<?> cq, CriteriaBuilder cb
{

                /** 可添加你的其他搜索過濾條件 默認已有創建時間過濾 **/
                Path<Date> createTimeField=root.get("createTime");
                Path<String> categoryIdField=root.get("categoryId");

                List<Predicate> list = new ArrayList<Predicate>();

                /** 創建時間 **/
                if(StrUtil.isNotBlank(searchVo.getStartDate())&&StrUtil.isNotBlank(searchVo.getEndDate())){
                    Date start = DateUtil.parse(searchVo.getStartDate());
                    Date end = DateUtil.parse(searchVo.getEndDate());
                    list.add(cb.between(createTimeField, start, DateUtil.endOfDay(end)));
                }

                /** 視頻分類 **/
                if(StrUtil.isNotBlank(videoCategory.getCategoryId())){        
                    list.add(cb.equal(categoryIdField,videoCategory.getCategoryId()));
                }

                Predicate[] arr = new Predicate[list.size()];
                cq.where(list.toArray(arr));
                return null;
            }
        }, pageable);
    }
2. controller
    @RequestMapping(value = "/getByCondition", method = RequestMethod.GET)
    @ApiOperation(value = "多條件分頁獲取")
    public Result<Page<VideoCategory>> getByCondition(
            @ModelAttribute VideoCategory videoCategory,
            @ModelAttribute SearchVo searchVo,
            @ModelAttribute PageVo pageVo){

        Page<VideoCategory> page = videoCategoryService.findByCondition(videoCategory, searchVo, PageUtil.initPage(pageVo));
        return new ResultUtil<Page<VideoCategory>>().setData(page);
    }
3. PageUtil
public static Pageable initPage(PageVo page){

        Pageable pageable = null;
        int pageNumber = page.getPageNumber();
        int pageSize = page.getPageSize();
        String sort = page.getSort();
        String order = page.getOrder();

        if(pageNumber<1){
            pageNumber = 1;
        }
        if(pageSize<1){
            pageSize = 10;
        }
        if(StrUtil.isNotBlank(sort)) {
            Sort.Direction d;
            if(StrUtil.isBlank(order)) {
                d = Sort.Direction.DESC;
            } else {
                d = Sort.Direction.valueOf(order.toUpperCase());
            }
            Sort s = new Sort(d, sort);
            pageable = PageRequest.of(pageNumber-1, pageSize, s);
        } else {
            pageable = PageRequest.of(pageNumber-1, pageSize);
        }
        return pageable;
    }

18年專科畢業后一度迷茫,創建了一個用來記錄自己成長的公眾號,感興趣的小伙伴可以關注一下~


免責聲明!

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



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