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

Awa*_*ing 14 java spring-data-jpa

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

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

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

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

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

Kam*_*kol 22

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

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

请参阅PageableDefaults注释 Javadoc.

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

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

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

更新:

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

public String showUsers(Model model, 
    @PageableDefault(page= 2 ,value = Integer.MAX_VALUE)
Run Code Online (Sandbox Code Playgroud)

请参阅PageableDefault批注 Javadoc.

  • 页面大小的上限为PageableHandlerMethodArgumentResolver的"maxPageSize"属性.因此,如果@PageagleDeafult注释的值大于'maxPageSize',则参数解析器会将其更改为'maxPageSize'.要正常运行,还需要将'maxPageSize'配置为Integer.MAX_VALUE (9认同)

luk*_*uke 14

如果您使用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);
}
Run Code Online (Sandbox Code Playgroud)

但是当你的大小值非常大(在Spring Data Core/spring-data-commons中大于2000)时,这是不够的1.12.3,因为大小仍然受到类中的maxPageSize变量的限制PageableHandlerMethodArgumentResolver,默认情况下设置为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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

这是 Spring 5.xx 的工作解决方案,您只需添加默认构造函数即可。请参阅上面的示例:

@Configuration
public class PaginationConfiguration extends SpringDataWebConfiguration {

    /**
     * @param context           must not be {@literal null}.
     * @param conversionService must not be {@literal null}.
     */
    public PaginationConfiguration(ApplicationContext context,
                                   @Qualifier("mvcConversionService") ObjectFactory<ConversionService> conversionService) {
        super(context, conversionService);
    }

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

        pageableHandlerMethodArgumentResolver.setMaxPageSize(Integer.MAX_VALUE);

        return pageableHandlerMethodArgumentResolver;
    }

}
Run Code Online (Sandbox Code Playgroud)


var*_*ren 6

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

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

@RequestMapping(path = "/comments")
public ModelAndView comments(@PageableLimits(maxSize = 100) Pageable pageable) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

可以通过自定义注释来完成:

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

    int minSize() default 0;
}
Run Code Online (Sandbox Code Playgroud)

以及扩展PageableHandlerMethodArgumentResolver配置:

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> 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);
    }
}
Run Code Online (Sandbox Code Playgroud)