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(课程表)增加