Spring Data JPA 复杂/多条件组合分页查询

 更新时间:2017年04月07日 09:57:58   作者:王晓东1号  
本文主要介绍了Spring Data JPA 复杂/多条件组合分页查询的相关资料。具有很好的参考价值。下面跟着小编一起来看下吧

话不多说,请看代码:

public Map<String, Object> getWeeklyBySearch(final Map<String, String> serArgs,
      String pageNum, String pageSize) throws Exception {
    // TODO Auto-generated method stub
    Map<String,Object> resultMap=new HashMap<String, Object>();
    // 判断分页条件
    pageNum = TextUtils.isNotBlank(pageNum) ? pageNum : "1";
    pageSize = TextUtils.isNotBlank(pageSize) ? pageSize : "10";
    // 分页时的总页数、每页条数、排序方式、排序字段
    Pageable StuPageable = PageUtils.buildPageRequest(Integer.valueOf(pageNum),Integer.valueOf(pageSize), new Sort(Direction.DESC, new String[] { "xmzbsj","lstProinfo.proId"}));
    // 按照条件进行分页查询,根据StuPageable的分页方式
     Page<Weekly> StuPage = proWeeklyDao.findAll(new Specification<Weekly>() {
      public Predicate toPredicate(Root<Weekly> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        List<Predicate> lstPredicates = new ArrayList<Predicate>();
        if (TextUtils.isNotBlank(serArgs.get("xmmc"))) {
          lstPredicates.add(cb.like(root.get("lstProinfo").get("xmmc").as(String.class), "%" + serArgs.get("xmmc") + "%"));
        }
        if (TextUtils.isNotBlank(serArgs.get("xmzbqssj"))) {
          lstPredicates.add(cb.greaterThanOrEqualTo(root.get("xmzbsj").as(String.class),serArgs.get("xmzbqssj")));
        }
        if (TextUtils.isNotBlank(serArgs.get("xmzbjzsj"))) {
          lstPredicates.add(cb.lessThanOrEqualTo(root.get("xmzbsj").as(String.class),serArgs.get("xmzbjzsj")));
        }
        Predicate[] arrayPredicates = new Predicate[lstPredicates.size()];
        return cb.and(lstPredicates.toArray(arrayPredicates));
      }
    }, StuPageable);
     // 按照条件进行分页查询
    resultMap = PageUtils.getPageMap(StuPage);
    return resultMap;
  }

buildPageRequest()方法,导入的包,下面是自己写的方法

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;

* @param pageNum 当前页
   * @param pageSize 每页条数
   * @param sortType 排序字段
   * @param direction 排序方向
   */
  public static PageRequest buildPageRequest(int pageNum, int pageSize, String sortType, String direction) {
    Sort sort = null;

    if (!TextUtils.isNotBlank(sortType)) {
      return new PageRequest(pageNum - 1, pageSize);
    } else if (TextUtils.isNotBlank(direction)) {
      if (Direction.ASC.equals(direction)) {
        sort = new Sort(Direction.ASC, sortType);
      } else {
        sort = new Sort(Direction.DESC, sortType);
      }
      return new PageRequest(pageNum - 1, pageSize, sort);
    } else {
      sort = new Sort(Direction.ASC, sortType);
      return new PageRequest(pageNum - 1, pageSize, sort);
    }
  }
   public static PageRequest buildPageRequest(int pageNum, int pageSize, String sortType) {
     return buildPageRequest(pageNum, pageSize, sortType, null);
   }

getPageMap()方法:

JPA的Page也是集合,获取Page集合里的值,最后获取到的这些(key,value)

/**
   * 封装分页数据到Map中。
   */
  public static Map<String, Object> getPageMap(Page<?> objPage) {
    Map<String, Object> resultMap = new HashMap<String, Object>();
    resultMap.put(Constants.PAGE_RESULT_LIST, objPage.getContent()); // 数据集合,符合查询条件的所有记录数据
    resultMap.put(Constants.PAGE_TOTAL_NUM, objPage.getTotalElements()); // 总记录数
    resultMap.put(Constants.PAGE_TOTAL_PAGE, objPage.getTotalPages()); // 总页数
    resultMap.put(Constants.PAGE_NUM, objPage.getNumber()); // 当前页码
    resultMap.put(Constants.PAGE_SIZE, objPage.getSize()); // 每页显示数量
    return resultMap;
  }

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • Spring-webflux 响应式编程的实例详解

    Spring-webflux 响应式编程的实例详解

    Spring 提供了两个并行堆栈,一种是基于带有 Spring MVC 和 Spring Data 结构的 Servlet API,另一个是完全反应式堆栈,它利用了 Spring WebFlux 和 Spring Data 的反应式存储库,这篇文章主要介绍了Spring-webflux 响应式编程,需要的朋友可以参考下
    2022-09-09
  • Java Socket实现文件传输示例代码

    Java Socket实现文件传输示例代码

    这篇文章主要介绍了Java Socket实现文件传输示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 详解Java设计模式编程中的策略模式

    详解Java设计模式编程中的策略模式

    这篇文章主要介绍了详解Java设计模式编程中的策略模式,策略模式强调对对象的封装使用,比如文中举的锦囊妙计的例子便很生动,需要的朋友可以参考下
    2016-02-02
  • SpringBoot项目中连接Gauss数据库

    SpringBoot项目中连接Gauss数据库

    本文主要介绍了SpringBoot项目中连接Gauss数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 混乱的Java日志体系及集成jar包梳理分析

    混乱的Java日志体系及集成jar包梳理分析

    这篇文章主要详细的为大家梳理分析了剪不断理还乱的Java日志体系,以及日志系统涉及到的繁杂的各种集成 jar 包,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-03-03
  • 从零开始SSM搭建步骤(图文)

    从零开始SSM搭建步骤(图文)

    这篇文章主要介绍了从零开始SSM搭建步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java:程序包javafx.geometry不存在问题及解决

    java:程序包javafx.geometry不存在问题及解决

    这篇文章主要介绍了java:程序包javafx.geometry不存在问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Spring中的retry重试组件详解

    Spring中的retry重试组件详解

    这篇文章主要介绍了Spring中的retry重试组件详解,Retry重试组件是一个处理重试逻辑的工具,可以在出现异常或失败情况下自动进行重试操作,从而提高程序的稳定性和可靠性,需要的朋友可以参考下
    2023-10-10
  • SpringAop日志找不到方法的处理

    SpringAop日志找不到方法的处理

    这篇文章主要介绍了SpringAop日志找不到方法的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Spring中自动注入的两种方式总结

    Spring中自动注入的两种方式总结

    Spring的核心技术IOC(Intorol of Converse控制反转)的实现途径是DI(dependency Insert依赖注入)。而依赖注入(DI)的实现方式又有两种,xml方式和注解方式。本文就来详细聊聊这两个方式,需要的可以了解一下
    2022-10-10

最新评论