Spring Data JAP中Pageable对象如何从1开始分页,而不是从0开始
概述
在Spring Data JPA中,Pageable 的分页默认是从0开始的,即第一页的页码是0。
1. 自定义工具方法
你可以创建一个工具方法,将前端传递的页码(从1开始)转换为Spring Data JPA需要的页码(从0开始)。
public class PageableUtils {public static Pageable createPageRequest(int page, int size, Sort sort) {// 将页码从1开始转换为从0开始return PageRequest.of(page - 1, size, sort);}public static Pageable createPageRequest(int page, int size) {// 将页码从1开始转换为从0开始return PageRequest.of(page - 1, size);}
}在服务层调用时:
public Page<MyEntity> getEntities(int page, int size) {Pageable pageable = PageableUtils.createPageRequest(page, size);return myRepository.findAll(pageable);
}2. 在Controller中处理
你也可以在Controller层处理页码的转换:
@GetMapping("/entities")
public Page<MyEntity> getEntities(@RequestParam int page, @RequestParam int size) {// 将页码从1开始转换为从0开始Pageable pageable = PageRequest.of(page - 1, size);return myService.getEntities(pageable);
}3. 自定义Pageable解析器
如果你希望全局处理页码的转换,可以自定义一个Pageable解析器。
@Configuration
public class CustomPageableConfiguration extends WebMvcConfigurationSupport {@Overrideprotected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver() {@Overridepublic Pageable resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {Pageable pageable = super.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);// 将页码从1开始转换为从0开始return PageRequest.of(pageable.getPageNumber() - 1, pageable.getPageSize(), pageable.getSort());}};argumentResolvers.add(resolver);}
}总结
虽然Spring Data JPA默认从0开始分页,但通过上述方法可以轻松实现从1开始分页的需求。选择哪种方式取决于你的具体场景和偏好。
