2014-09-10 24 views
6

Ho creato la seguente query @RepositoryRestResource in cui voglio creare una query dinamica per il mio riposo API. Quindi, in pratica vorrei fare qualcosa di simile:Spring Data Rest - Parametri con valori predefiniti

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

Così ho creato la domanda di seguito:

@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); 

Ovviamente alcuni di questi potrebbe non essere stato inserito. C'è un modo per definire i valori predefiniti nel repository? Quindi ad esempio vorrei name per avere un valore predefinito di %.

Non sono del tutto sicuro che questo approccio sia corretto per quello che voglio fare, quindi qualsiasi suggerimento alternativo è benvenuto.

risposta

7

So che questo è più vecchio, ma ho avuto un problema simile e risolto nel modo seguente:

@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

Si noti che con questa tecnica non è possibile utilizzare il tipo di dati primitivo per i parametri, l'uso invece la loro controparte oggetto wrapper. E.g .: 'Integer' e non' int' –

1

Di fronte allo stesso problema, e per quanto ho potuto ricercare, il modo migliore per risolverlo è creare una query diversa per ciascun insieme di valori.

1

Quindi, una possibile soluzione potrebbe essere che si potrebbe andare al controller e utilizzare nel vostro @Controller/@RestController tua @RequestParam con gli attributi required = false e defaultValue = "%".

Una chiamata corrispondente potrebbe assomigliare a questo:

@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; 
    } 

Così ora avete ottenuto il vostro impostare i valori predefiniti. Non conosco un modo per impostarli direttamente a livello di repository, però. Ho creato una domanda su questo diritto here

Problemi correlati