Как выполнить запрос по заданным параметрам в хранилище Mongo - PullRequest
1 голос
/ 17 октября 2019

У меня есть запрос к хранилищу Монго, как показано ниже. Если мы предоставим и имя, и цену, он даст ответ. Я хочу получить ответ, если мы дадим только имя, цену или и то, и другое. как сделать эти параметры необязательными. если мы предоставляем и имя, и цену, я хочу получить агрегированный результат, если я не хочу искать только из заданного поля. Большое спасибо за помощь.

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

Ответы [ 3 ]

1 голос
/ 18 октября 2019

Я не верю, что вы сможете сделать это с подходом имени метода для определения запроса. Из документации ( ссылка ):

Существует 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);
}
1 голос
/ 17 октября 2019

Либо вам может понадобиться реализовать пользовательский запрос 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 MongoDB - JPA Спецификации, такие как

0 голосов
/ 22 октября 2019

Здесь я нашел простое решение, используя регулярное выражение mongodb, мы можем написать запрос, подобный этому, @Query("{name : {$regex : ?0}, type : {$regex : ?1})List<String> findbyNameAndType(String name, String type) Хитрость в том, что если мы хотим выполнить запрос по данному параметру, мы должны задать другим параметрам некоторые значения по умолчанию. В качестве примера здесь думает, что мы предоставляем только имя. Затем мы устанавливаем тип для выбора всех возможных совпадений, устанавливая его параметр по умолчанию как «. *». Этот шаблон регулярного выражения дает любое совпадение строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...