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提到的。 你会得到这样的东西:
如您所见,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; } }
现在一切都按预期工作:
值得一提的是,在@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,然后在所有控制器中具有相同的行为。
这样,当您发送请求时,您可以指定是否只需要一些记录(发送“页面”参数和“大小”),或者如果您想要它们(不发送这些参数),但总是得到相同的回归结构。