2012-07-23 22 views
14

Używam wiosennych danych mongo z metodami zapytań opartymi na JSON i nie jestem pewien, w jaki sposób zezwolić na opcjonalne parametry w zapytaniu.spring-data-mongo - opcjonalne parametry zapytania?

Na przykład - mówią miałem następującą funkcję

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

-ale nie chcieliśmy zastosować nazwę regex mecz, czy nie stosuje się ograniczenie zakresu dat czy wartości NULL były przekazywane do metody.

W tej chwili wygląda na to, że mogę utworzyć zapytanie za pomocą mongoTemplate.

Czy są jakieś alternatywy - czy używasz mongoTemplate jako najlepszej opcji?

Dzięki

+0

Na razie poszedłem na dół za pomocą klas Kryteriów. Wydaje się to o wiele czystsze niż osadzanie zapytań JSON w adnotacjach i łatwiejsze jest dostosowywanie, które pola są pobierane. –

Odpowiedz

16

zaimplementować to w operacji logicznych I wykonaj następujące czynności i konwersji do operacji, które są dostępne w językach programowania

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

w prostym SQL odbywa się to jako

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

W MongoDB odbywa się to poprzez $ gdzie

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

Możemy przyspieszyć ten proces trochę za pomocą operacji Mongo, zamiast budować wszystko do funkcji kosztem pewnej czytelności. nie działa niestety.

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

Więc co masz jest

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

ta może być rozszerzona do obsługi tablic w/wszystkie klauzule

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

może być zainteresowany w dostarczaniu informacji zwrotnej lub głos na ten temat wydanie: https://jira.springsource.org/browse/DATAJPA-209

To zajmuje exa ctly ten problem., z wyjątkiem SD JPA. Wydaje się, że byłaby odpowiednia dla wielu innych podprojektów SD.

+0

Dzięki, głosowali na to! –

0

Podany bilet dotyczy wyszukiwaczy generujących ich zapytania SQL za pomocą "nazwy magicznej", np. findByTitleAndSubtitle(), który teraz działa poprawnie. Ale wciąż jest ten sam problem, kiedy przypisujesz tę wyszukiwarkę za pomocą @Query ("wybierz produkt, gdzie title =: title and subtitle =: subtitle"); wartości null są tłumaczone na "subtitle = null", a zatem nie zostaną znalezione.

Powiązane problemy