Để thực hiện điều này trong logic Boolean, tôi thực hiện như sau và chuyển đổi sang các hoạt động có sẵn trong ngôn ngữ lập trình
:query != null -> field == :query
!(:query != null) || (field == :query)
(:query == null) || (field == :query)
Trong SQL thuần túy, điều này được thực hiện dưới dạng
where (null = :query) or (field = :query)
Trong MongoDB, điều này được thực hiện thông qua $ where
{ $where: '?0 == null || this.field == ?0' }
Chúng tôi có thể tăng tốc quá trình này một chút bằng cách sử dụng Thao tác Mongo thay vì xây dựng mọi thứ thành chức năng với chi phí có thể đọc được. Rất tiếc, không hoạt động.
{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] }
Vì vậy, những gì bạn có là
@Query("{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] }")
List<Something> findAll(String query, Pageable pageable);
Điều này có thể được mở rộng hơn nữa để xử lý các mảng cho trong / tất cả các mệnh đề
@Query("{ $or : [ { $where: '?0.length == 0' } , { field : { $in : ?0 } } ] }")
List<Something> findAll(String query, Pageable pageable);