【问题标题】:How to query upon the given parameters in Mongo repository如何查询 Mongo 存储库中的给定参数
【发布时间】:2019-10-17 06:01:37
【问题描述】:

我有一个如下的 mongo 存储库查询,如果我们同时提供名称和价格,它会给出响应。如果我们只提供名称或价格或两者都提供,我想得到回应。如何使这些参数可选。如果我们同时提供名称和价格,我想检索聚合结果,除非我只想从给定字段中搜索。非常感谢您的帮助。

List<Response> findByNameAndPrice(String name, int price)

【问题讨论】:

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


    【解决方案1】:

    在这种情况下,您可能需要实现自定义 JPA 查询或需要使用 QueryDSL。

    1) 类似自定义 JPA 查询,如果要添加新的可选参数,可能需要更改查询。

    @Query(value = "{$or:[{name: ?0}, {?0: null}], $or:[{price: ?1}, {?1: null}]}")
    List<Response> findByNameAndPrice(String name, Integer price)
    

    2) QueryDSL 方法,您可以添加尽可能多的可选参数,无需修改代码。它会自动生成查询。

    更多信息请参考此链接:Spring Data MongoDB Repository - JPA Specifications like

    【讨论】:

    • 感谢您的回复,我希望使用 mongo repostiory 实现此功能!
    • @AkalankaHewawasam 更新了我的答案,您可以检查第一种方法是否有效,但 queryDSL 肯定会有效。
    • 我尝试了查询,但它抛出错误,无效的 JSON 输入。位置:14。字符:'?'。不幸的是,我无法使用查询 dsl,因为我使用的是最新的 gradle 版本。
    【解决方案2】:

    我不相信您可以使用方法名称方法来定义查询。来自文档(reference):

    JIRAticket 与此有关,Spring 团队仍在调查

    你可以试试这个方法

    在仓库中

    List<Response> findByName(String name)
    List<Response> findByPrice(int price)
    List<Response> findByNameAndPrice(String name, int price)
    

    在您的服务文件中

    public List<Response> findByNameAndPrice(String name, int price){
        if(name == null ){
            return repository.findByName(name);
        }
        if( price == 0){
            return repository.findByPrice(price);
        }
        return repository.findByNameAndPrice(name, price);
    }
    

    【讨论】:

    • 这种做法很明显。在我的场景中,我有 5 个参数,并且“if”链会更长,这就是我希望在查询级别对其进行排序的原因。
    • @AkalankaHewawasam 尝试 JPA 标准 API 查询
    【解决方案3】:

    在这里我找到了一个使用 mongodb 正则表达式的简单解决方案,我们可以编写这样的查询, @Query("{name : {$regex : ?0}, type : {$regex : ?1})List&lt;String&gt; findbyNameAndType(String name, String type) 诀窍是如果我们想查询给定的参数,我们应该为其他参数设置一些默认值。作为一个例子,这里认为我们只提供名称。然后我们通过将其默认参数设置为“.*”来设置类型以选择其所有可能的匹配项。 此正则表达式模式提供任何字符串匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2019-06-09
      • 2011-10-17
      • 1970-01-01
      • 2017-12-29
      相关资源
      最近更新 更多