2015-09-22 39 views
14

Chcę napisać niektóre metody zapytań w warstwie repozytorium. Ta metoda musi ignorować parametry puste. Na przykład:Parametr opcjonalny Spring Data w metodzie zapytania

List<Foo> findByBarAndGoo(Bar barParam, @optional Goo gooParam); 

Ta metoda musi być powrotu Foo przez tego warunku:

bar == barParam && goo == gooParam; 

jeśli gooParam not null. jeśli parametr gooParam był zerowy, wówczas zmiana stanu na:

bar == barParam; 

Czy istnieje rozwiązanie? Czy ktoś może mi pomóc?

+2

O czym dokładnie mówisz? –

+0

Lista findByBarAndGoo (pasek kreskowy, @optional Goo goo) {jeśli (bar == null || goo == null) {throw new IllegalArgumentException ("Parametry nie mogą być puste");}} – erhun

+0

Mam na myśli opcjonalny parametr jeśli ten parametr Param był zerowy, a następnie metoda zapytania IGNORUJ ten parametr. Dzięki. –

Odpowiedz

-2

Mogłeś kodować ten sam w zaledwie kilku linii:

List<Foo> findByBarAndOptionalGoo(Bar bar, Goo goo) { 
    return (goo == null) ? this.findByBar(bar) : this.findByBarAndGoo(bar, goo); 
} 

W przeciwnym razie, nie wiem, czy wiosna-Data obsługuje ten po wyjęciu z pudełka.

8

Nie wierzę, że będziesz w stanie to zrobić z metodą nazw metod do definicji zapytania. Z dokumentacji (reference):

Chociaż coraz zapytanie pochodzi od nazwy metody jest dość wygodne, można stawić czoła sytuacji, w których stosuje się metodę nazwa parser nie obsługuje jedno słowo kluczowe chce korzystać lub nazwa metody byłaby niepotrzebnie brzydka. Więc można użyć JPA nazwie zapytań za pośrednictwem konwencji nazewnictwa (patrz Korzystanie WZP NamedQueries dla więcej informacji) lub raczej opisywanie metodę frazę @query

myślę, że masz taką sytuację tutaj, więc poniżej odpowiedź korzysta z metody adnotacji @Query, która jest prawie tak wygodna, jak metoda nazwy metody (reference).

@Query("select foo from Foo foo where foo.bar = :bar and " 
     + "(:goo is null or foo.goo = :goo)") 
    public List<Foo> findByBarAndOptionalGoo(
     @Param("bar") Bar bar, 
     @Param("goo") Goo goo);