spring data jpa limit pagesize,如何设置为maxSize

我有一个要求是通过可分页和不可分页搜索,

在我的Java代码中,我使用spring数据jpa Pageable类,

Pageable pageable = new PageRequest( queryForm.getPageNumber()- 1, queryForm.getPageSize(),Sort.Direction.ASC,"id"); Page page = repository.fullTextSearch(queryForm.getText(), pageable); 

而且我不想改变回归结构,

那么当不可分页的情况(搜索全部)时,如何将pageSize值设置为MAX?

结合Spring MVC,您可以使用PageableDefaults注释,其value = Integer.MAX_VALUE

 public String showUsers(Model model, @PageableDefaults(pageNumber = 0, value = Integer.MAX_VALUE) Pageable pageable) { … } 

请参阅PageableDefaults注释 Javadoc。

在任何其他客户端代码中,您可以将第二个构造函数参数设置为Integer.MAX_VALUE

 new PageRequest( queryForm.getPageNumber()- 1, queryForm.getPageSize() == null ? Integer.MAX_VALUE : queryForm.getPageSize(), Sort.Direction.ASC,"id"); 

请参阅PageRequest构造函数 。 我假设queryForm.getPageSize()是包装类型而不是基元。 否则,如果用户未设置pageSize(有意为“全部搜索”请求),则会得到零。

更新:

从Spring Data Commons 1.6开始,你应该使用PageableDefault而不是PageableDefaults

 public String showUsers(Model model, @PageableDefault(page= 2 ,value = Integer.MAX_VALUE) 

请参阅PageableDefault批注 Javadoc。

如果您使用Spring MVC,这可能会对您有所帮助。 根据下面的评论,这个答案完全正确的Spring 4.xx并且可能更早,但对于Spring 5.xx,您可能需要另一个解决方案。

您要做的第一件事是使用@PageableDefault批注并将大小设置为Integer.MAX_VALUE或您想要的任何其他值:

 public SomeResponseObject getSomething( @PageableDefault(size = Integer.MAX_VALUE) Pageable page ) { return someService.getSomething(page); } 

但是当你的大小值非常大(在Spring Data Core / spring-data-commons 1.12.3大于2000)时,这还maxPageSize ,因为大小仍然会受到PageableHandlerMethodArgumentResolver类中的maxPageSize变量的限制, maxPageSize默认设置为2000这是pdorgambide提到的。 你会得到这样的东西:
由于默认maxPageSize,响应的大小限制为2000
如您所见,size = 2000而不是预期大小= 2147483647(size = Integer.MAX_VALUE)。
所以第二步是改变提到的maxPageSize 。 我们可以通过重写PageableHandlerMethodArgumentResolver 。 其中一种方法是在适当的包中创建一个合适的java配置文件 – 如果你在项目中使用这种配置。 如果您的项目使用此文件,您也可以在xml配置文件中执行此操作。 有我的解决方案(Java Spring配置文件):

 @Configuration @EnableConfigurationProperties public class PaginationConfiguration extends SpringDataWebConfiguration { @Bean public PageableHandlerMethodArgumentResolver pageableResolver() { PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver = new PageableHandlerMethodArgumentResolver(sortResolver()); pageableHandlerMethodArgumentResolver.setMaxPageSize(Integer.MAX_VALUE); return pageableHandlerMethodArgumentResolver; } } 

现在一切都按预期工作:
响应的大小等于Integer.MAX_VALUE,即2147483647

值得一提的是,在@PageableDefault注释value相当于size 。 换句话说,它是size别名。 这意味着您可以写入value=Integer.MAX_VALUE而不是size=Integer.MAX_VALUE value=Integer.MAX_VALUE 。 更有道理的是,你可以在同一时间使用两者。 如果它们不同,则仅考虑size

如果你需要这样的每个控制器限制:

 @RequestMapping(path = "/users") public ModelAndView users(@PageableLimits(maxSize = 10) Pageable pageable) { ... } @RequestMapping(path = "/comments") public ModelAndView comments(@PageableLimits(maxSize = 100) Pageable pageable) { ... } 

它可以使用自定义注释完成:

 @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface PageableLimits { int maxSize() default Integer.MAX_VALUE; int minSize() default 0; } 

并扩展了PageableHandlerMethodArgumentResolver配置:

 @Configuration public class MvcConfig extends WebMvcConfigurerAdapter { @Override public void addArgumentResolvers(List argumentResolvers) { PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver() { @Override public Pageable resolveArgument(MethodParameter methodParameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) { Pageable p = super.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory); return getLimitsFromAnnotation(p, methodParameter); } private Pageable getLimitsFromAnnotation(Pageable p, MethodParameter methodParameter) { PageableLimits limits = methodParameter.getParameterAnnotation(PageableLimits.class); if (limits == null) return p; if (p.getPageSize() > limits.maxSize()) return PageRequest.of(p.getPageNumber(), limits.maxSize(), p.getSort()); else if (p.getPageSize() < limits.minSize()) return PageRequest.of(p.getPageNumber(), limits.minSize(), p.getSort()); return p; } }; resolver.setMaxPageSize(Integer.MAX_VALUE); argumentResolvers.add(resolver); super.addArgumentResolvers(argumentResolvers); } } 

这对我有用:

所有可分页请求都使用MyCustomPage ,如果在请求中找不到,则使用默认页面和大小。

如果大小(记录数超过最大值),我设置一个默认值,在这种情况下为50。

 public class MyCustomPage extends PageRequest{ Integer MAX_PAGE_SIZE = 50 //constructor public MyCustomPage(Integer page, Integer size) { super(page,(size>MAX_PAGE_SIZE)?MAX_PAGE_SIZE:size); } } 

也许你可以使用:

 @Override @GetMapping("/some") public ResponseEntity> getTemplateInfo( @PageableDefault(sort = "displayedName") Pageable pageable, @RequestParam(defaultValue = Integer.MAX_VALUE + "") Integer trueSize) { pageable = new PageRequest(pageable.getPageNumber, Math.max(pageable.getPageSize, trueSize),..) .... } 

我在我的代码中使用它:

 public Page retrieveData(@RequestBody CustomParameters query, Pageable pageable, Sort sort) { if (pageable == null) { return new PageImpl<>(repository.findAll(query.buildSpecification(), sort)); } return repository.findAll(query.buildSpecification(), pageable); } 

这有几个优点。 如果在控制器中使用它,则可以始终定义Pageable和Sort参数,如果请求包含“page”参数,将自动创建Pageable(如果有“sort”参数,它将包含在pageable中,如果它不是null或在Sort参数中,如果是)。

您可以在配置中自定义sortResolver和pageableResolver,然后在所有控制器中具有相同的行为。

这样,当您发送请求时,您可以指定是否只需要一些记录(发送“页面”参数和“大小”),或者如果您想要它们(不发送这些参数),但总是得到相同的回归结构。