• 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年专科毕业后一度迷茫,创建了一个用来记录自己成长的公众号,感兴趣的小伙伴可以关注一下~

  • 相关阅读:
    多态的使用
    抽象类与具体类
    对象应该长什么样子
    方法的重载overload
    遵守合约:覆盖的规则
    Android 自定义Dialog
    less 之Extend 及 Extend all用法
    github常见错误整理!
    js获取元素宽高
    解决 Error: Access denied for user 'root'@'localhost' (using password: YES)
  • 原文地址:https://www.cnblogs.com/niceyoo/p/10817290.html
Copyright © 2020-2023  润新知