【问题标题】:How to limit select count globally in spring data jpa?如何在春季数据 jpa 中全局限制选择计数?
【发布时间】:2016-02-12 12:55:54
【问题描述】:

最新项目我使用了 Spring boot 和 Spring Data Jpa,在一些 web 界面用户可以动态搜索一些记录,e.g.按createdDate搜索订单,按名称搜索商品等。因为存在许多搜索条件,例如名称、品牌、状态等。所以我用Jpa Specification来实现动态搜索。因此页面可以将以下查询参数传递给搜索记录,例如

GET /goods?search_LIKE_name=foo #fuzzy search goods by name
GET /goods?search_LIKE_name=foo&search_EQ_status=1 #fuzzy search goods by name and status

等等。

但是如果页面什么都不传递,那么它将全选。我不希望这种情况发生。而且我知道 mysql 命令行有一个名为 --select_limit 的选项,那么我该如何全局配置它以限制选择计数?例如在 application.properties 中

spring.sql_select_limit=1000

【问题讨论】:

    标签: mysql spring-boot spring-data-jpa


    【解决方案1】:

    不知道有没有全局配置,但是我有一个比较简洁的本地解决方案。在控制器方法上,只需在可分页之前使用注释@PageableDefaults(pageNumber = 0, value = x)

    控制器方法:

    public List<Item> fuzzySearch(Object filter, @PageableDefaults(pageNumber = 0, value = x) Pageable pageable) {}
    

    如果页面参数缺少注释中指定的默认值。

    编辑:

    如果您设法将分页参数从请求重命名为 sizepage 并使用带有Pageable 作为参数的方法签名,您可以全局设置页面默认值而不是使用@ 987654324@ 需要的注释。 只需覆盖扩展WebMvcConfigurerAdapter@Configuration 类中的方法即可。

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
        resolver.setFallbackPageable(new PageRequest(0, 1000));
        argumentResolvers.add(resolver);
        super.addArgumentResolvers(argumentResolvers);
    }
    

    【讨论】:

    • 谢谢!但是我没有可分页的参数,我直接解析请求参数。公共列表 模糊搜索(HttpServletRequest 请求){}。如果请求中没有 pageNumber,我将显式分配一个 pageRequest 参数,如下所示:findAll(spec,new PageRequest(0, 1000));
    • 好的,但是如果您在请求中有名为 size 和 page 的参数,并且您添加 Pageable 作为方法参数,它们将被自动推断为声明的 Pageable。所以你仍然可以使用我的答案。
    猜你喜欢
    • 2016-01-30
    • 2013-11-12
    • 2018-07-31
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多