情有独钟的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;
    }

转载自:https://www.cnblogs.com/niceyoo/p/10817290.html

JPA分页查询与条件分页查询的更多相关文章

  1. 使用ArcGIS API for Silverlight 进行复合多条件空间查询

    原文:使用ArcGIS API for Silverlight 进行复合多条件空间查询 这两天帮网上认识的一个兄弟做了一个查询的示例,多多少少总结一下,在此和大家分享. 为什么说是复合多条件呢?因为进 ...

  2. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  3. mysql(单表查询,多表查询,MySQl创建用户和授权,可视化工具Navicat的使用)

    单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT ...

  4. day43 数据库学习 转自egon 老师博客 单表查询和多表查询

    一 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键 ...

  5. JPA实现复杂条件分页查询

    相信熟悉Hibernate的人对于ORM给编程带来的便利于快捷一定不陌生,相对于MyBatis等需要编写复杂的SQL语句,ORM映射为我们带来的便利显而易见.但是,在获得便利的同时,失去的便是灵活性, ...

  6. 序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询

    查询窗口中可以设置很多查询条件 表单中输入的内容转为datagrid的load方法所需的查询条件向原请求地址再次提出新的查询,将结果显示在datagrid中 转换方法看代码注释 <td cols ...

  7. spring data jpa条件分组查询及分页

    原book对象 package com.shaying.domain; import javax.persistence.Column; import javax.persistence.Entity ...

  8. 【spring data jpa】带有条件的查询后分页和不带条件查询后分页实现

    一.不带有动态条件的查询 分页的实现 实例代码: controller:返回的是Page<>对象 @Controller @RequestMapping(value = "/eg ...

  9. jpa自定义条件分页查询

    主要依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

随机推荐

  1. UI与数据的绑定

    核心是数据变化跟踪与UI更新的问题 概念整理: 供业务使用的叫数据: 供UI使用的叫状态: UI的变化能被监听到: 数据的变化能实时反映到UI上: 数据变化—>拦截—〉UI状态重置—>UI ...

  2. 修改mysql 8.0.16 root 密码--mac

    https://blog.csdn.net/HECTOR_1368391900/article/details/90732097 https://my.oschina.net/u/3251146/bl ...

  3. 我的首次AK记

    哈哈哈!本蒟蒻终于在今天中午机房测试中AK全场了(其实没啥技术含量,只有5个水题,对,全都很水)

  4. BZOJ 3561: DZY Loves Math VI 莫比乌斯反演+复杂度分析

    推到了一个推不下去的形式,然后就不会了 ~ 看题解后傻了:我推的是对的,推不下去是因为不需要再推了. 复杂度看似很大,但其实是均摊 $O(n)$ 的,看来分析复杂度也是一个能力啊 ~ code: #i ...

  5. CF1245D: Shichikuji and Power Grid

    CF1245D: Shichikuji and Power Grid 题意描述: 给定\(n\)个点\((n\leq2000)\),在第\(i\)个点上建立一个基站需要\(c_i\)的代价,连接两个点 ...

  6. smashing 开源方便的dashboard 试用

    smashing 一个方便的dashboard 工具,是在Shopify/dashing 上维护的一个版本因为原有的官方团队不在维护了 smashing 使用简单,提供了脚手架同时也有好多人开发了一些 ...

  7. 树形DP入门题目推荐以及解析

    关于树形DP几道入门题目 今天恶补树形DP,感觉海星. 其实挺简单的. 介绍几道例题,我会的. 1.洛谷P1352 没有上司的舞会 我的一篇题解 我们可以考虑每一个节点都是有两种情况. 一个是被邀请: ...

  8. shell 给文件每一行都添加指定字符串

    [admin@localhost file]$ cat file hello hello hello hello hello [admin@localhost file]$ cat test.sh # ...

  9. Linux后台运行和关闭程序、查看后台任务

    fg.bg.jobs.&.ctrl+z   1.&    (最经常被用到)     这个用在一个命令的最后,可以把这个命令放到后台执行   2.ctrl + z     可以将一个正在 ...

  10. 如何完美更换WordPress网站的域名

    前几天,一位WordPress王牌主机的用户问我,他的WordPress网站已经建立一年多了,现在想要修改网站使用的域名,该如何操作?这是WordPress用户经常遇到的问题.今天我们来给大家介绍一下 ...