2014-09-10 18 views
6

Tôi đã tạo truy vấn @RepositoryRestResource sau đây nơi tôi muốn tạo truy vấn động cho api còn lại của mình. Vì vậy, về cơ bản tôi muốn làm điều gì đó như:Nghỉ ngơi dữ liệu mùa xuân - Tham số với giá trị mặc định

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

Vì vậy, tôi đã tạo ra các truy vấn dưới đây:

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

Rõ ràng một số số này có thể không được nhập. Có cách nào để xác định các giá trị mặc định trên Kho lưu trữ không? Vì vậy, ví dụ: tôi muốn name để có giá trị mặc định là %.

Tôi không hoàn toàn chắc chắn cách tiếp cận này là chính xác cho những gì tôi muốn làm, vì vậy bất kỳ đề xuất thay thế đều được chào đón.

Trả lời

7

Tôi biết điều này là cũ, nhưng tôi đã có một vấn đề tương tự và giải quyết nó như sau:

@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

Lưu ý rằng với kỹ thuật này, bạn không thể sử dụng kiểu dữ liệu nguyên thủy cho các thông số, sử dụng thay vào đó phần đối tượng bao bọc của họ. Ví dụ: 'Integer' và không' int' –

1

Đối mặt với cùng một vấn đề, và theo như tôi có thể nghiên cứu, cách tốt nhất để giải quyết vấn đề này là thực hiện một truy vấn khác nhau cho từng bộ giá trị.

1

Vì vậy, một giải pháp khả dĩ có thể là bạn có thể truy cập bộ điều khiển và sử dụng trong số @Controller/@RestController@RequestParam của mình với các thuộc tính required = falsedefaultValue = "%".

Một cuộc gọi tương ứng có thể trông như thế này:

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

Vì vậy, bây giờ bạn đã giá trị mặc định của bạn thiết lập. Tuy nhiên, tôi không biết cách đặt chúng trực tiếp ở cấp kho lưu trữ. Tôi tạo ra một câu hỏi về điều đó đúng here

Các vấn đề liên quan