2014-09-10 73 views
6

我創建了以下@RepositoryRestResource查詢,我想爲其餘api創建一個動態查詢。所以基本上我希望做這樣的事情:Spring Data Rest - 使用默認值的參數

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

所以我創建了下面的查詢:顯然,其中的一些可能尚未進入

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

。有什麼方法可以在存儲庫上定義默認值?所以例如我想name有一個默認值%

我不完全確定這種方法對於我想要做的是正確的,所以我們歡迎任何其他建議。

回答

7

我知道這是舊的問題,但我也有類似的問題,並解決它,如下所示:

@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

請注意,這個技術,你不能使用參數的原始數據類型,使用他們的包裝器對象相反部分。例如:'Integer'而不是'int' – 2016-12-08 16:00:49

1

面對同樣的問題,並且據我所能研究,解決此問題的最佳方法是對每組值進行不同的查詢。

1

所以,一個可能的解決方案,你可能會去控制器和使用您的@Controller/@RestController@RequestParam與屬性required = falsedefaultValue = "%"

一個相應的呼叫可能是這樣的:

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

所以,現在你有你的默認值設置。不過,我不知道直接在存儲庫級別設置它們的方法。我創建了一個關於正確here