1

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

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

3 回答 3

1

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

于 2019-10-22T18:25:56.687 回答
1

我不相信您可以通过查询定义的方法名称方法来做到这一点。从文档(参考):

有一张关于此的JIRA 罚单仍在团队调查中。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);
}
于 2019-10-18T06:06:50.947 回答
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

于 2019-10-17T06:14:35.960 回答