Spring-boot Необязательный параметр ArrayList в запросе Json MongoDb - PullRequest
0 голосов
/ 17 мая 2018

Просматривая другие посты о том, как сделать необязательный запрос параметров с помощью mongodb и параметров inpu в виде списка, я обнаружил, что это можно сделать с помощью чего-то подобного:

@Query("{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] }")
List<Something> findAll(String query, Pageable pageable);

Мой запрос выглядит так:

@Query("{ $or : [ { $where: '?3 == null' } ,{ input1 : { $in : ?3 } }], 'input2' : ?4 , 'input3' : ?2 ,'dateInput' : {$gt : ?0, $lte : ?1}}")
List<Entities> findThingsbyInputs(Long initialDate, Long endDate, Integer Input2, List<Integer> input1, Integer input3);

Когда я использую этот запрос и Input1 =? 0 = ArrayList , это хорошо работает, если список не равен нулю, но когда? 0 равен нулю, исключение запускается. Я могу запросить несколько входных параметров со списком, но когда ноль, он не работает.

Сообщение об ошибке: Сбой запроса с кодом ошибки 2 и сообщением об ошибке «$ in нуждается в массиве» на локальном сервере: 27017

Любая помощь? и заранее спасибо

1 Ответ

0 голосов
/ 24 августа 2018

Я столкнулся с той же проблемой и в итоге расширил хранилище и вручную внедрил сложные методы.
После отладки я думаю, что проблема связана с тем фактом, что когда List<Integer> input1 равно null, то первое или условие { $where: '?3 == null' } проходит, но затем выполняется второе { input1 : { $in : ?3 } } и в итоге выглядит как: { input1 : { $in : NULL } }, что вызывает столкнулся с проблемой.

Моим решением было расширить репозитории, внедрить метод и вручную построить требуемый запрос. В вашем случае это может быть что-то вроде:

  @Autowired
  MongoTemplate mongoTemplate;

  List<Entities> findThingsbyInputs(Long initialDate, Long endDate, Integer input2,
                                    List<Integer> input1, Integer input3) {
    Query query = new Query();
    if(initialDate != null) {
      query.addCriteria(where("input1").is(input1));
    }

    query.addCriteria(where("input2").is(input2));
    query.addCriteria(where("input3").is(input3));
    query.addCriteria(new Criteria().andOperator(where("dateInput").gt(initialDate),
        where("dateInput").lt(endDate)));

    return mongoTemplate.find(query, Entities.class);

  }  

A Билет Jira по-прежнему не разрешен Spring Team .

...