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

情有獨鍾的JPA

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

關於JPA的使用

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

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

圖方便直接貼代碼了:web

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 便可,一樣也提供給了咱們分頁查詢的方法:spring

舉例:sql

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 開始的。微信

廢話很少說,來看一段代碼吧:app

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;
    }

若是文章有錯的地方歡迎指正,你們互相留言交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:niceyooide

相關文章
相關標籤/搜索