2015-09-22 8 views
14

Ich möchte einige Abfrage Methoden in Repository-Schicht schreiben. Diese Methode muss Null-Parameter ignorieren. Zum Beispiel:Spring Data optionale Parameter in Abfrage-Methode

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

Diese Methode muss Rückhol seine Foo durch diese Bedingung:

bar == barParam && goo == gooParam; 

wenn gooParam nicht null. Wenn GooParam null war, dann ändere die Bedingung zu:

bar == barParam; 

Gibt es eine Lösung? Kann mir jemand helfen?

+2

Worüber genau redest du? –

+0

Liste findByBarAndGoo (Balkenleiste, @optional Goo) {if (bar == null || goo == null) {neue IllegalArgumentException ("Parameter können nicht null sein");}} – erhun

+0

Ich meine in optionalen Parameter if dieser Param war null dann Abfrage-Methode IGNORE diesen Parameter. Vielen Dank. –

Antwort

-2

Sie diesen Code konnte sich in nur wenigen Zeilen:

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

Ansonsten weiß ich nicht, ob Frühling-Daten, die diese aus der Box unterstützt.

8

Ich glaube nicht, dass Sie das mit dem Methodennamen Ansatz zur Abfragedefinition tun können. Aus der Dokumentation (reference):

Obwohl eine Abfrage aus dem Methodennamen abgeleitet bekommen ist ziemlich bequem, könnte man die Situation konfrontiert, in denen entweder der Verfahren Name Parser nicht das Schlüsselwort man verwenden will, unterstützt oder die Methode Name würde unnötig hässlich werden. So können Sie entweder JPA Abfragen durch eine Namenskonvention benannt (siehe Verwendung JPA NamedQueries für weitere Informationen) oder eher mit Anmerkungen versehen Abfragemethode mit @Query

Ich glaube, Sie haben diese Situation hier, so die Antwort unten verwendet den Annotation-Ansatz von @Query, der fast so praktisch ist wie der Methodennamensantrag (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);