Spring boot 如何在Mongo存储库中查询给定参数

Spring boot 如何在Mongo存储库中查询给定参数,spring-boot,jpa,spring-data-jpa,mongorepository,Spring Boot,Jpa,Spring Data Jpa,Mongorepository,我有一个mongo Repository查询,如下所示,如果我们同时提供名称和价格,它会给出响应。我想得到回应,如果我们只提供名称或价格或两者。如何使这些参数成为可选参数。如果我们同时提供名称和价格,我希望检索聚合结果,除非我只想从给定字段进行搜索。非常感谢你的帮助 List<Response> findByNameAndPrice(String name, int price) List findByNameAndPrice(字符串名,int-price) 在这种情况下,您可能需

我有一个mongo Repository查询,如下所示,如果我们同时提供名称和价格,它会给出响应。我想得到回应,如果我们只提供名称或价格或两者。如何使这些参数成为可选参数。如果我们同时提供名称和价格,我希望检索聚合结果,除非我只想从给定字段进行搜索。非常感谢你的帮助

List<Response> findByNameAndPrice(String name, int price)
List findByNameAndPrice(字符串名,int-price)

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

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

@Query(value = "{$or:[{name: ?0}, {?0: null}], $or:[{price: ?1}, {?1: null}]}")
List<Response> findByNameAndPrice(String name, Integer price)
@Query(value=“{$or:[{name:-0},{-0:null}],$or:[{price:-1},{-1:null}]}”)
列出findByNameAndPrice(字符串名称,整数价格)
2) QueryDSL方法,您可以添加尽可能多的可选参数,无需修改代码。它将自动生成查询


有关更多信息,请参阅此链接:

您可能需要实现自定义JPA查询,或者需要在此类场景中使用QueryDSL

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

@Query(value = "{$or:[{name: ?0}, {?0: null}], $or:[{price: ?1}, {?1: null}]}")
List<Response> findByNameAndPrice(String name, Integer price)
@Query(value=“{$or:[{name:-0},{-0:null}],$or:[{price:-1},{-1:null}]}”)
列出findByNameAndPrice(字符串名称,整数价格)
2) QueryDSL方法,您可以添加尽可能多的可选参数,无需修改代码。它将自动生成查询


有关更多信息,请参阅此链接:

我不相信使用查询定义的方法名方法可以做到这一点。从文档()中:

关于这一点,有一个
JIRA
Spring
团队仍在调查中

你可以这样试试

存储库中

List<Response> findByName(String name)
List<Response> findByPrice(int price)
List<Response> findByNameAndPrice(String name, int price)
List findByName(字符串名)
清单findByPrice(内部价格)
列出findByNameAndPrice(字符串名称,整数价格)
在您的服务文件中

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);
}
公共列表findByNameAndPrice(字符串名称,int-price){
if(name==null){
返回repository.findByName(名称);
}
如果(价格==0){
返回repository.findByPrice(价格);
}
返回repository.findByNameAndPrice(名称、价格);
}

我不相信使用查询定义的方法名方法可以做到这一点。从文档()中:

关于这一点,有一个
JIRA
Spring
团队仍在调查中

你可以这样试试

存储库中

List<Response> findByName(String name)
List<Response> findByPrice(int price)
List<Response> findByNameAndPrice(String name, int price)
List findByName(字符串名)
清单findByPrice(内部价格)
列出findByNameAndPrice(字符串名称,整数价格)
在您的服务文件中

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);
}
公共列表findByNameAndPrice(字符串名称,int-price){
if(name==null){
返回repository.findByName(名称);
}
如果(价格==0){
返回repository.findByPrice(价格);
}
返回repository.findByNameAndPrice(名称、价格);
}

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

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

感谢您的响应,我希望此实现使用mongo Repository!@Akalankahewasam更新了我的答案您可以检查第一种方法是否有效,但queryDSL肯定会有效。我尝试了查询,但它抛出了错误,JSON输入无效。位置:14。字符:“?”。我无法使用查询dsl很遗憾,因为我使用的是最新的gradle版本。感谢您的回复,我希望此实现使用mongo Repository!@Akalankahewasam更新了我的答案您可以检查第一种方法是否有效,但queryDSL肯定会有效。我尝试了查询,但它抛出了错误,JSON输入无效。位置:14。字符:“?”。我无法不幸的是,由于我使用的是最新的gradle版本,所以使用查询dsl。这种方法很明显。在我的场景中,我有5个参数和“if”链将更长,这就是我希望在查询级别对其进行排序的原因。@AkalankaHewawasam try JPA Criteria API querys这种方法很明显。在我的场景中,我有5个参数,“if”链将更长,这就是我希望在查询级别对其进行排序的原因。@akalankahewasam try JPA Criteria API querys