Java Spring MongoDB Custom Filter игнорирует нулевые параметры - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь фильтровать с помощью пользовательского выражения и нескольких полей. Для имени поля я использую регулярное выражение. И все остальные поля, которые я проверяю, содержатся ли они в списке параметров.

@Query(value = 
    "{$and:["
        + "{'name': {$regex: ?0, $options: 'i'}},"
        + "{'types': {$in: ?1}},"
        + "{'customer': {$in: ?2}}"
    + "]}")
Optional<List<Object>> findByFilter(
            @Param("name") String name,
            @Param("types") Collection<String> types,
            @Param("customers") Collection<String> customers,
            Pageable pageable);

Как я могу игнорировать, если параметр равен нулю? Я пробовал язык выражения Spring, но он не работает.

@Query(value = 
    "{$and:["
        + "{'name': {$regex: ?0, $options: 'i'}},"
        + "{'types': {$in: ?1}},"
        + "?#{ [2] != null ? {'customer': {$in: [2]}} }"
    + "]}")
Optional<List<Object>> findByFilter(
            @Param("name") String name,
            @Param("types") Collection<String> types,
            @Param("customers") Collection<String> customers,
            Pageable pageable);

1 Ответ

0 голосов
/ 04 марта 2020

Я не уверен, если это возможно, но рекомендую вам использовать MongoTemplate , который более гибкий , чем MongoRepository синтаксис.

@Autowired
private MongoTemplate mongotemplate;

Criteria criteria = Criteria.where("name").regex(name).and("types").in(types);
if (customers != null || !customers.isEmpty()) {
    criteria.and("customers").in(customers);
}

List<YourClass> result = mongotemplate.find(Query.query(criteria).with(pageable), YourClass.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...