sprinboot jpa设置查询条件,排序,分页查询

本文详细描述了一个使用SpringBoot开发的API,涉及如何接收用户登录日志查询参数,通过Specification接口进行自定义查询条件设置(包括时间范围和模糊搜索),并结合Pageable实现分页查询,返回PageResults对象。
摘要由CSDN通过智能技术生成
public ResponseBean userLoginLog(@RequestBody HashMap<String, Object> paramMap) {
        Integer pageNo;
        Integer pageSize;
        try {
            pageNo = Integer.parseInt((String) paramMap.get("pageNo"));
            pageSize = Integer.parseInt((String) paramMap.get("pageSize"));
        } catch (Exception e) {
            pageNo = (Integer) paramMap.get("pageNo");
            pageSize = (Integer) paramMap.get("pageSize");
        }
        paramMap.remove("pageNo");
        paramMap.remove("pageSize");
        /**
         * 自定义查询条件
         *      1. 实现Specification接口(提供泛型;查询的对象类型)
         *      2. 实现toPredicate方法(构造查询条件)
         *      3.  需要借助方法参数中的两个参数(
         *              root:获取需要查询的对象属性
         *              CriteriaBuilder:构造查询条件,内部封装了很多查询条件(模糊匹配,精准匹配)
         */
        List<Predicate> listAnd = new ArrayList<>(); //组装and语句
        Specification<UserLoginLog> spec = (root, query, criteriaBuilder) -> {
            //判断paramMap是否包含startTime和endTime
            if (paramMap.containsKey("startTime") && paramMap.containsKey("endTime")) {
                listAnd.add(criteriaBuilder.greaterThanOrEqualTo(root.get("operTime").as(String.class), (String) paramMap.get("startTime")));
                listAnd.add(criteriaBuilder.lessThanOrEqualTo(root.get("operTime").as(String.class), (String) paramMap.get("endTime")));
                //删除startTime和endTime
                paramMap.remove("startTime");
                paramMap.remove("endTime");
            }
            paramMap.forEach((k, v) -> {
                Path<UserLoginLog> path = root.get(k);
                Predicate like = criteriaBuilder.like(path.as(String.class), "%" + v + "%");
                listAnd.add(like);
            });
            return criteriaBuilder.and(listAnd.toArray(new Predicate[listAnd.size()]));
        };

        /**
         * 添加排序Sort
         *      Sort.Direction.DESC表示降序
         *      Sort.Direction.ASC表示升序
         *      properties是指实体类的属性名(不是字段名)
         */
        Sort sort = new Sort(Sort.Direction.ASC, "createTime");
        /**
         *  分页参数Pageable
         *      参数1:查询的页码
         *      参数2:每页查询的条数
         *      参数3:查询结果的排序规则(可选
         */
        Pageable pageable = new PageRequest(pageNo, pageSize, sort);
        /**
         *  分页查询
         *      参数1:查询条件Specification
         *      参数2:分页参数Pageable
         */
        Page<UserLoginLog> page = userLoginLogRepository.findAll(spec, pageable);
        PageResults<UserLoginLog> pageResults = new PageResults<>();
        pageResults.setTotalRecord(page.getTotalElements());
        pageResults.setTotalPage((long) page.getTotalPages());
        pageResults.setResult(page.getContent());
        return new ResponseBean(ResponseCode.RC00_1000, pageResults);
    }
    ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值