Spring Data JPA 技术总结

Spring Data JPA 技术总结

关于项目中使用spring data jpa,在项目结束后想做一下关于jpa的总结和心得首先是分页查询,不多说直接贴代码

**

@GetMapping
    public ResponseEntity getAll(
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "20") int pageSize,
            @RequestParam(required = false) String courseTypes,
            @RequestParam(required = false) String title,
            @RequestParam(required = false) String isRecommended,
            @RequestParam(required = false) String category,
            @RequestParam(defaultValue = "PUBLISHED", required = false) String status) {
        Specification<Course> specification = new Specification<Course>() {
            @Override
            public Predicate toPredicate(Root<Course> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                List<Predicate> list = new ArrayList<Predicate>();
                if (courseTypes != null && !courseTypes.isEmpty()) {
                    CriteriaBuilder.In in = criteriaBuilder.in(root.get("courseType"));
                    Arrays.asList(courseTypes.split(",")).forEach(in::value);
                    list.add(in);
                }
                if (isRecommended != null && !isRecommended.isEmpty()) {
                    list.add(criteriaBuilder.equal(root.get("isRecommended").as(String.class), isRecommended));
                }
                if (category != null && !category.isEmpty()) {
                    list.add(criteriaBuilder.equal(root.get("categoryId").as(String.class), category));
                }
                if (title != null && !title.isEmpty()) {
                    list.add(criteriaBuilder.like(root.get("title").as(String.class), "%" + title + "%"));
                }
                if (status != null && !status.isEmpty()) {
                    list.add(criteriaBuilder.equal(root.get("status").as(String.class), status));
                }
                if(category==null){
                    Join<Category, Course> join = root.join("category", JoinType.LEFT);
                }
                Predicate[] predicates = new Predicate[list.size()];
                return criteriaBuilder.and(list.toArray(predicates));
            }
        };
        PageRequest pageRequest = PageRequest.of(page - 1, pageSize, Sort.by(Sort.Direction.ASC, "columnOrdered"));
        Page<Course> coursePage = courseRepository.findAll(specification, pageRequest);
        return ResponseEntity.status(HttpStatus.OK)
                .header(DapengConst.PAGINATION_COUNT_HEADER, String.valueOf(coursePage.getTotalElements()))
                .header(DapengConst.PAGINATION_PAGES_HEADER, String.valueOf(coursePage.getTotalPages()))
                .header(DapengConst.PAGINATION_SIZE_HEADER, String.valueOf(coursePage.getSize()))
                .header(DapengConst.PAGINATION_NUMBER_HEADER, String.valueOf(coursePage.getNumber()))
                .body(courseDtoAssembler.course2Dto(coursePage.getContent()));
    }

**

在这里需要注意的事是:左右关联查询的,需要在实体类中加入springData jpa 的一对多/或者多对一的注解,比如课程和分类,一个分类对应多个课程,那么是一对多的关系,在分类(Category)增加课程集合,那么在Course(课程表)增加

在这里插入图片描述
在这里插入图片描述

注意 这里的分页查询,包含了基本上所有的需求,比如left join 关联其他表,以及传递多个参数(比如集合等等),数据层直接继承JpaRepository<XX,String>,JpaSpecificationExecutor ,直接调用内部方法find All 成功完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值