spring data jpa 限制页面大小,如何设置为 maxSize

2022-09-02 05:07:21

我有一个要求是按可分页和不可分页进行搜索,

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

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

我不想改变回报结构,

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


答案 1

结合Spring MVC,您可以使用类似注释PageableDefaultsvalue = Integer.MAX_VALUE

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

请参阅 PageableDefaults annotation Javadoc。

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

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

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

更新:

自春季数据共享1.6以来,您应该使用而不是PageableDefaultPageableDefaults

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

请参阅 PageableDefault annotation Javadoc。


答案 2

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

您要做的第一件事是使用注释并将 size 设置为 Integer.MAX_VALUE 或所需的任何其他值:@PageableDefault

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

但是,当您的大小值非常大(在Spring Data Core/spring-data-commons中大于2000)时,这是不够的,因为大小仍将受到类中变量的限制,该变量默认设置为2000。pdorgambide提到了这一点。你会得到这样的东西:正如你所看到的,
Response with size limited to 2000 because of default maxPageSize
有size=2000而不是预期的size=2147483647(size=Integer.MAX_VALUE)。
所以第二步是改变提到的。我们可以通过覆盖.其中一种方法是在适当的包中创建适当的java配置文件 - 如果您在项目中使用此类配置。如果您的项目使用 xml 配置文件,您也可以在 xml 配置文件中执行此操作。有我的解决方案(Java Spring配置文件):1.12.3maxPageSizePageableHandlerMethodArgumentResolvermaxPageSizePageableHandlerMethodArgumentResolver

@Configuration
@EnableConfigurationProperties
public class PaginationConfiguration extends SpringDataWebConfiguration {

    @Bean
    public PageableHandlerMethodArgumentResolver pageableResolver() {
        PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver =
            new PageableHandlerMethodArgumentResolver(sortResolver());

        pageableHandlerMethodArgumentResolver.setMaxPageSize(Integer.MAX_VALUE);

        return pageableHandlerMethodArgumentResolver;
    }

}

现在一切按预期工作:
Response with proper size equal to Integer.MAX_VALUE which is 2147483647

还值得一提的是,在注解中等价于。换句话说,它是 的别名。这意味着您可以编写.更重要的是,您可以同时使用两者是没有意义的。如果它们不同,则仅考虑在内。@PageableDefaultvaluesizesizesize=Integer.MAX_VALUEvalue=Integer.MAX_VALUEsize


推荐