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

时间:2014-05-20 04:46:54

标签: java spring-data-jpa

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

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

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

我不想改变回归结构,

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

13 个答案:

答案 0 :(得分:19)

与Spring MVC结合使用时,您可以PageableDefaults使用value = 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 constructor。我假设queryForm.getPageSize()是包装类型而不是基元。否则,如果用户未设置pageSize(有意为“全部搜索”请求),则会得到零。

更新:

自Spring Data Commons 1.6起,您应该使用PageableDefault而不是PageableDefaults

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

PageableDefault annotation Javadoc。

答案 1 :(得分:12)

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

您要做的第一件事是使用@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类,默认设置为2000. pdorgambide提到了这一点。你会得到这样的东西:
Response with size limited to 2000 because of default maxPageSize
正如您所看到的那样,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;
    }

}

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

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

答案 2 :(得分:2)

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

@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<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);
    }
}

答案 3 :(得分:2)

这是Spring 5.x.x的有效解决方案。您只需要添加默认构造函数。参见上面的示例:

@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;
    }

}

答案 4 :(得分:1)

从Spring Data 2.0开始,您还可以执行以下操作:

@Configuration
public class WebConfiguration implements PageableHandlerMethodArgumentResolverCustomizer {

    @Override
    public void customize(PageableHandlerMethodArgumentResolver pageableResolver) {
        pageableResolver.setFallbackPageable(Pageable.unpaged());
    }

}

答案 5 :(得分:0)

这对我有用:

所有可分页请求都使用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);
    }
}

答案 6 :(得分:0)

也许您可以使用:

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

答案 7 :(得分:0)

我在代码中使用它:

public Page<MyObject> 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,然后在所有控制器中都具有相同的行为。

通过这种方式发送请求时,您可以指定是否只需要一些记录(选择“页面”参数和“大小”),还是只需要全部记录(不发送这些参数),但是您始终得到相同的返回结构。

答案 8 :(得分:0)

答案 9 :(得分:0)

application.property

from os.path import basename with open(file) as scope: for line in scope: line = line.strip() if line.startswith('contains') and line.endswith('.h') or line.endswith('.hpp'): path = line.split()[-1] scopeFileList.append(basename(path)) 中使用此属性并分配更高的值。

答案 10 :(得分:0)

pageable = PageRequest.of(0, Integer.MAX_VALUE);

如果基于某些条件覆盖可分页的页面,最好不要更改排序,只需传递

// pageable is coming from function
if(!isPageable)
    pageable = PageRequest.of(0, Integer.MAX_VALUE, pageable.getSort());

PageRequest的软件包 org.springframework.data.domain.PageRequest

答案 11 :(得分:0)

在较新版本的spring-data(自v2.0起)中,您只需创建一个org.springframework.data.web.config.PageableHandlerMethodArgumentResolverCustomizer的bean并设置PageableHandlerMethodArgumentResolver.setMaxPageSize.

@Configuration
public class WebMvcConfig {

    @Bean
    public PageableHandlerMethodArgumentResolverCustomizer paginationCustomizer() {
        return pageableResolver -> pageableResolver.setMaxPageSize(5);
    }
}

答案 12 :(得分:-2)

对于Spring 5.x.x,在abp's中设置Abp's