Spring -data-mongo - необязательные параметры запроса? - программирование
Подтвердить что ты не робот

Spring -data-mongo - необязательные параметры запроса?

Я использую spring -data mongo с методами запросов на основе JSON и не знаю, как разрешить дополнительные параметры в поисковом запросе.

Например, скажем, у меня была следующая функция

@Query("{ 'name' : {$regex : ?0, $options : 'i'}, 'createdDate' : {$gte : ?1, $lt : ?2 }} }")
List<MyItem> getItemsLikeNameByDateRange(String name, Date startDateRange, Date endDateRange);

-but, я не хотел применять совпадение регулярных выражений или не применял ограничение диапазона дат, если значения NULL были переданы методу.

На данный момент похоже, что мне, возможно, придется построить запрос, используя mongoTemplate.

Есть ли какие-либо альтернативы - или использует mongoTemplate лучший вариант?

Спасибо

4b9b3361

Ответ 1

Чтобы реализовать это в логической логике, я делаю следующее и преобразование в операции, доступные в языках программирования

:query != null -> field == :query
!(:query != null) || (field == :query)
(:query == null) || (field == :query)

В простом SQL это делается как

where (null = :query) or (field = :query)

В MongoDB это делается через $where

{ $where: '?0 == null || this.field == ?0' } 

Мы можем немного ускорить это, используя Mongo Operations, вместо того, чтобы строить все для функции за счет некоторой удобочитаемости. к сожалению не работает.

{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] } 

Итак, у вас есть

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

Это может быть дополнительно расширено для обработки массивов для /all clauses

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

Ответ 2

Возможно, вам будет интересно получить отзывы или проголосовать по этому вопросу: https://jira.springsource.org/browse/DATAJPA-209

Он касается именно этой проблемы., за исключением SD JPA. Похоже, это было бы уместно для многих других подпроектов SD.

Ответ 3

Данный билет касается поисковиков, генерирующих их SQL, с помощью "магии имени", например. findByTitleAndSubtitle(), который теперь отлично работает. Но есть еще та же проблема, когда вы аннотируете этот искатель с помощью @Query ( "выберите продукт, где title=: title и subtitle=: subtitle" ); нулевые значения переводятся в "subtitle= null" и поэтому не будут найдены.