JPA Specification常用查询+排序实例

编辑: admin 分类: java 发布时间: 2021-12-03 来源:互联网
目录
  • JPA Specification常用查询+排序
    • 1.第一步:继承父类
    • 2.第二步
  • JPA Specification复杂查询+排序
    • 需求
    • 开始了
      • 1.dao
      • 2.service
      • 3.排序
    • 前端
      • 结束语

      JPA Specification常用查询+排序

      1.第一步:继承父类

      public interface TblCarton2RCardLogRepository extends JpaRepository<TblCarton2RCardLog, String>,JpaSpecificationExecutor<TblCarton2RCardLog> {

      2.第二步

      tblCarton2RCardLogRepository.findAll(new Specification<TblCarton2RCardLog>() {
          @Override
          public  Predicate toPredicate(Root<TblCarton2RCardLog> root, CriteriaQuery<?> query,CriteriaBuilder cb) {
              List<Predicate> list = new ArrayList<Predicate>();
              list.add(cb.equal(root.get("cartonNo").as(String.class), cartonNo));//某普通字段
              list.add(cb.equal(root.get("id").get("rCard").as(String.class), rCard));//主键中某字段
              list.add(cb.like(root.get("mocode").as(String.class), "%" + mocode + "%"));//like
              list.add(cb.between(root.get("frozenDate").as(Long.class), frozenDateStart, frozenDateEnd));//between and
              list.add(cb.greaterThanOrEqualTo(root.get("id").get("rcard").as(String.class), rCardStart));//大于等于
              list.add(root.get("id").get("lotNo").as(String.class).in(lotNos));//in
              //ORDER BY packdate DESC,packtime DESC
              Predicate[] p = new Predicate[list.size()];
              query.where(cb.and(list.toArray(p)));
              query.orderBy(cb.desc(root.get("packDate")),cb.desc(root.get("packTime")));
              return query.getRestriction();
          }
      });
      

      JPA Specification复杂查询+排序

      刚使用spring-data-jpa,遇到不少难题,网上查了很多资料,发现讲jpa的不多,发个我刚做过的接口的过程吧。

      需求

      看到图了吗?需要实现搜索以及各种字段的排序还要分页,还有可能有选择各种条件的下拉列表,是不是很变态?

      开始了

      1.dao

      需要先处理dao层,这里喜欢叫repository。做一个实体类的dao层接口,继承JpaSpecificationExecutor,再写一个查询接口。

      2.service

      在这里主要处理的是查询条件,我这里是搜索功能的模糊查询,当然如果有更多的查询也可以添加进这里。这里需要注意的是specification。

      3.排序

      需要先建一个辅助的实体类,属性名我取和需要排序的实体类一样的名字,但是注意属性都是String类型的啊。后面细说,先上我建的辅助类。

      @Data
      public class DeptSort {
      private String id;//编码
      private String name;//名称
      private String highDeptName;//上级部门
      private String principal;//负责人
      private String deptType;//部门类型
      private String enable;//启用
      }

      字段都是需要排序的字段,这是为了好区分,叫别的也可以。

      下面是controller层,排序功能的具体实现。

      public ResponseModel table(@RequestParam("search")String search,
      @RequestParam("pageNumber")Integer pageNumber,
      @RequestParam("pageSize")Integer pageSize,
      @RequestBody DeptSort deptSort){
      ResponseModel model = null;
      try {
      List<Sort.Order> orders = new ArrayList<Sort.Order>();
      if (StringUtils.isNotBlank(deptSort.getId())){
      orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getId()),"id"));
      }
      if (StringUtils.isNotBlank(deptSort.getName())){
      orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getName()),"name"));
      }
      if (StringUtils.isNotBlank(deptSort.getHighDeptName())){
      orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getHighDeptName()),"highDeptName"));
      }
      if (StringUtils.isNotBlank(deptSort.getPrincipal())){
      orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getPrincipal()),"principal"));
      }
      if (StringUtils.isNotBlank(deptSort.getDeptType())){
      orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getDeptType()),"deptType"));
      }
      if (StringUtils.isNotBlank(deptSort.getEnable())){
      orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getEnable()),"enable"));
      }
      //orders不能为空,所以如果为空设置按id排序[/code][code] if (orders.size() == 0){
      orders.add(new Sort.Order(Sort.Direction.ASC,"id"));
      }
      Sort sort = new Sort(orders);
      Pageable pageable = new PageRequest(pageNumber,pageSize,sort);
      Page<Businessdept> all = service.findAll(search, pageable);
      model = ResponseModel.getSuccessResponseModel().setData(all);
      }catch (Exception e){
      e.printStackTrace();
      model = ResponseModel.getFailedResponseModel();
      }
      return model;
      }

      需要的参数有搜索内容search,还有DeptSort辅助类。首先建立

      List<Sort.Order> orders = new ArrayList<Sort.Order>();

      集合,然后if判断将参数加入集合。

      需要说明的是类似

      orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getEnable()),"enable"))

      语句,“enable”是需要查询的Businessdept里的字段,不是辅助类的,当然这里我的辅助类和Businessdept类一致,但是不一样的同学需要注意了。

      前端

      对于前端传递的参数有什么要求呢?

      deptSort的各个属性的参数只能限定两种asc和desc,即升序和降序。上图的功能需求只需要传deptSort里的一个属性就可以了,这里传两个参数演示一下。

      查询成功的数据不展示了,给大家看一个后台的SQL语句

      Hibernate: 
      /* select
      count(generatedAlias0) 
      from
      Businessdept as generatedAlias0 
      where
      (
      generatedAlias0.name like :param0 
      ) 
      and (
      generatedAlias0.deleteIs=1 
      ) */ select
      count(businessde0_.id) as col_0_0_ 
      from
      t_department businessde0_ 
      where
      (
      businessde0_.name like ?
      ) 
      and businessde0_.delete_is=1
      Hibernate: 
      /* select
      generatedAlias0 
      from
      Businessdept as generatedAlias0 
      where
      (
      generatedAlias0.name like :param0 
      ) 
      and (
      generatedAlias0.deleteIs=1 
      ) 
      order by
      generatedAlias0.deptType asc,
      generatedAlias0.enable desc */ select
      businessde0_.id as id1_3_,
      businessde0_.delete_is as delete_i2_3_,
      businessde0_.dept_type as dept_typ3_3_,
      businessde0_.enable as enable4_3_,
      businessde0_.high_dept_id as high_dep5_3_,
      businessde0_.high_dept_name as high_dep6_3_,
      businessde0_.name as name7_3_,
      businessde0_.principal as principa8_3_ 
      from
      t_department businessde0_ 
      where
      (
      businessde0_.name like ?
      ) 
      and businessde0_.delete_is=1 
      order by
      businessde0_.dept_type asc,
      businessde0_.enable desc limit ?

      可以看到条件查询,升序、降序都有。

      结束语

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。

      【原URL http://www.yidunidc.com/usa.html复制请保留原URL】