За да реализирам това в булева логика, правя следното и преобразувам в операции, които са налични в езици за програмиране
: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);
Това може да бъде допълнително разширено за обработка на масиви за in/all клаузи
@Query("{ $or : [ { $where: '?0.length == 0' } , { field : { $in : ?0 } } ] }")
List<Something> findAll(String query, Pageable pageable);