2014-09-10 7 views
6

Ich habe die folgende @RepositoryRestResource Abfrage erstellt, wo ich eine dynamische Abfrage für meine Rest API erstellen möchte. Also im Grunde würde ich will, wie etwas zu tun ist:Spring Data Rest - Parameter mit Standardwerten

myHost/myApp/data/search/all?name=me&age=20&address=myhome&etc=etc 

So habe ich die Abfrage unten erstellt:

@Query("Select t from Data t " + 
      "where " + 
      "t.name like :name AND " + 
      "t.age = :age AND " + 
      "t.address = :address AND " + 
      "t.etc= :etc" 
    @RestResource(path = "all", rel = "all") 
    Page findByAll(@Param("name") String name, @Param("age") String age, 
      @Param("address") String address, @Param("etc") String etc, Page page); 

Offensichtlich einige von ihnen können nicht eingegeben wurden. Gibt es eine Möglichkeit, Standardwerte für das Repository zu definieren? So würde ich zum Beispiel name einen Standardwert von % haben wollen.

Ich bin mir nicht ganz sicher, ob dieser Ansatz der richtige für das ist, was ich machen möchte, daher sind alternative Vorschläge willkommen.

Antwort

7

Ich weiß, das ist schon älter, aber ich hatte ein ähnliches Problem und löste es wie folgt:

@Query("Select t from Data t " + 
     "where " + 
     "(:name IS NULL or t.name like :name) AND " + 
     "(:age IS NULL or t.age = :age) AND " + 
     "(:address IS NULL or t.address = :address) AND " + 
     "(:etc IS NULL or t.etc= :etc)") 
@RestResource(path = "all", rel = "all") 
Page findByAll(@Param("name") String name, @Param("age") String age, 
     @Param("address") String address, @Param("etc") String etc, Page page); 
+2

Beachten Sie, dass mit dieser Technik nicht primitive Datentypen für Parameter verwenden kann, verwenden stattdessen ihr Wrapper-Objekt-Counter-Part. Beispiel: "Integer" und nicht "int" –

1

Konfrontiert mit dem gleichen Problem, und soweit ich recherchieren konnte, ist der beste Weg, um dies zu lösen, eine andere Abfrage für jeden Satz von Werten zu machen. So

1

, könnte eine mögliche Lösung sein, dass Sie an den Controller gehen könnte und verwenden in Ihrem @Controller/@RestController Ihre @RequestParam mit Attributen required = false und defaultValue = "%".

Ein entsprechender Aufruf könnte wie folgt aussehen:

@RestController 
... 
@RequestMapping(value = "[myCallFromFrontend]", method = RequestMethod.GET) 
public ResponseItem getItemsByFilters (
    @RequestParam(required = false, defaultValue = "%") String name, 
    @RequestParam(required = false, defaultValue = "%") String age, 
    @RequestParam(required = false, defaultValue = "%") String address, 
    @RequestParam(required = false, defaultValue = "%") String etc, 
    HttpServletResponse response){ 

    ResponseItem item = null; 
    try { 
     //you might do this in service layer. 
     item = myRepository.findByAll(name, age, address, etc); 
    } catch (myException mE) { 
      log.error("...", mE); 
      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
     } 
     return item; 
    } 

So, jetzt hast du deine Standardwerte gesetzt. Ich kenne keine Möglichkeit, sie direkt auf Repository-Ebene zu setzen. Ich habe eine Frage zu diesem Recht here

Verwandte Themen