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.
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.你会得到这样的东西:

如您所见,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)
值得一提的是,@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)
如果您需要像这样的每个控制器的限制:
@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)
| 归档时间: |
|
| 查看次数: |
29949 次 |
| 最近记录: |