我有一个要求是按可分页和不可分页搜索
在我的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?
答案 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提到了这一点。你会得到这样的东西:
正如您所看到的那样,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
的别名。这意味着您可以编写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)
请参考:
Paging with Spring Boot 1:https://reflectoring.io/spring-boot-paging/
Configuring a Spring Boot Module with @ConfigurationProperties
答案 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
。