我有一个如下的 mongo 存储库查询,如果我们同时提供名称和价格,它会给出响应。如果我们只提供名称或价格或两者都提供,我想得到回应。如何使这些参数可选。如果我们同时提供名称和价格,我想检索聚合结果,除非我只想从给定字段中搜索。非常感谢您的帮助。
List<Response> findByNameAndPrice(String name, int price)
我有一个如下的 mongo 存储库查询,如果我们同时提供名称和价格,它会给出响应。如果我们只提供名称或价格或两者都提供,我想得到回应。如何使这些参数可选。如果我们同时提供名称和价格,我想检索聚合结果,除非我只想从给定字段中搜索。非常感谢您的帮助。
List<Response> findByNameAndPrice(String name, int price)
在这里我找到了一个使用 mongodb 正则表达式的简单解决方案,我们可以这样写一个查询,
@Query("{name : {$regex : ?0}, type : {$regex : ?1})List<String> findbyNameAndType(String name, String type)
诀窍是如果我们想查询给定的参数,我们应该为其他参数设置一些默认值。作为一个例子,这里认为我们只提供名称。然后我们通过将其默认参数设置为“.*”来设置类型以选择其所有可能的匹配项。此正则表达式模式提供任何字符串匹配。
我不相信您可以通过查询定义的方法名称方法来做到这一点。从文档(参考):
有一张关于此的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);
}
在这种情况下,您可能需要实现自定义 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