更新分页查询功能:新增关键词查询

This commit is contained in:
2026-06-02 17:58:26 +08:00
parent 20bc61b5fe
commit 7a41a68e23
3 changed files with 93 additions and 2 deletions
@@ -18,6 +18,9 @@ public interface IGroupCourseRepository {
Mono<PageResponse<GroupCourse>> findByPage(PageRequest pageRequest); Mono<PageResponse<GroupCourse>> findByPage(PageRequest pageRequest);
Mono<PageResponse<GroupCourse>> findByPageAndNotDeleted(PageRequest pageRequest); Mono<PageResponse<GroupCourse>> findByPageAndNotDeleted(PageRequest pageRequest);
Mono<PageResponse<GroupCourse>> findByPageWithKeyword(PageRequest pageRequest);
Mono<PageResponse<GroupCourse>> findByPageWithKeywordAndNotDeleted(PageRequest pageRequest);
Mono<GroupCourse> save(GroupCourse groupCourse); Mono<GroupCourse> save(GroupCourse groupCourse);
Mono<GroupCourse> update(GroupCourse groupCourse); Mono<GroupCourse> update(GroupCourse groupCourse);
@@ -10,6 +10,7 @@ import cn.novalon.gym.manage.groupcourse.entity.GroupCourseEntity;
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRepository; import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRepository;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
import org.springframework.data.relational.core.query.Criteria;
import org.springframework.data.relational.core.query.Query; import org.springframework.data.relational.core.query.Query;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
@@ -178,4 +179,84 @@ public class GroupCourseRepository implements IGroupCourseRepository {
return Mono.empty(); return Mono.empty();
}); });
} }
@Override
public Mono<PageResponse<GroupCourse>> findByPageWithKeyword(PageRequest pageRequest) {
int page = pageRequest.getPage();
int size = pageRequest.getSize();
String sort = pageRequest.getSort();
String order = pageRequest.getOrder();
String keyword = pageRequest.getKeyword();
Sort sortObj = Sort.unsorted();
if (sort != null && !sort.isEmpty()) {
sortObj = Sort.by(Sort.Direction.fromString(order), sort);
}
org.springframework.data.domain.PageRequest pageable = org.springframework.data.domain.PageRequest.of(page, size, sortObj);
Criteria criteria = Criteria.empty();
if (keyword != null && !keyword.isEmpty()) {
criteria = criteria.or(Criteria.where("course_name").like("%" + keyword + "%"))
.or(Criteria.where("location").like("%" + keyword + "%"))
.or(Criteria.where("description").like("%" + keyword + "%"));
}
Query query = Query.query(criteria);
return r2dbcEntityTemplate.select(GroupCourseEntity.class)
.matching(query.with(pageable))
.all()
.collectList()
.zipWith(r2dbcEntityTemplate.count(query, GroupCourseEntity.class))
.map(tuple -> {
long total = tuple.getT2();
int totalPages = (int) Math.ceil((double) total / size);
List<GroupCourse> courseList = tuple.getT1().stream()
.map(groupCourseConverter::toDomain)
.toList();
return new PageResponse<>(courseList, totalPages, total, page, size);
});
}
@Override
public Mono<PageResponse<GroupCourse>> findByPageWithKeywordAndNotDeleted(PageRequest pageRequest) {
int page = pageRequest.getPage();
int size = pageRequest.getSize();
String sort = pageRequest.getSort();
String order = pageRequest.getOrder();
String keyword = pageRequest.getKeyword();
Sort sortObj = Sort.unsorted();
if (sort != null && !sort.isEmpty()) {
sortObj = Sort.by(Sort.Direction.fromString(order), sort);
}
org.springframework.data.domain.PageRequest pageable = org.springframework.data.domain.PageRequest.of(page, size, sortObj);
Criteria criteria = Criteria.where("deleted_at").isNull();
if (keyword != null && !keyword.isEmpty()) {
criteria = criteria.and(
Criteria.where("course_name").like("%" + keyword + "%")
.or(Criteria.where("location").like("%" + keyword + "%"))
.or(Criteria.where("description").like("%" + keyword + "%"))
);
}
Query query = Query.query(criteria);
return r2dbcEntityTemplate.select(GroupCourseEntity.class)
.matching(query.with(pageable))
.all()
.collectList()
.zipWith(r2dbcEntityTemplate.count(query, GroupCourseEntity.class))
.map(tuple -> {
long total = tuple.getT2();
int totalPages = (int) Math.ceil((double) total / size);
List<GroupCourse> courseList = tuple.getT1().stream()
.map(groupCourseConverter::toDomain)
.toList();
return new PageResponse<>(courseList, totalPages, total, page, size);
});
}
} }
@@ -139,10 +139,17 @@ public class GroupCourseService implements IGroupCourseService {
Mono.defer(() -> { Mono.defer(() -> {
logger.debug("缓存未命中,查询数据库 - findByPage: key={}", cacheKey); logger.debug("缓存未命中,查询数据库 - findByPage: key={}", cacheKey);
Mono<PageResponse<GroupCourse>> resultMono; Mono<PageResponse<GroupCourse>> resultMono;
boolean hasKeyword = keyword != null && !keyword.isEmpty();
if (includeDeleted) { if (includeDeleted) {
resultMono = groupCourseRepository.findByPage(pageRequest); resultMono = hasKeyword
? groupCourseRepository.findByPageWithKeyword(pageRequest)
: groupCourseRepository.findByPage(pageRequest);
} else { } else {
resultMono = groupCourseRepository.findByPageAndNotDeleted(pageRequest); resultMono = hasKeyword
? groupCourseRepository.findByPageWithKeywordAndNotDeleted(pageRequest)
: groupCourseRepository.findByPageAndNotDeleted(pageRequest);
} }
return resultMono.flatMap(pageResponse -> { return resultMono.flatMap(pageResponse -> {