2016-08-19 20 views
5

Tiếp theo official documentation, thêm @EnableSpringDataWebSupport chú thích để cấu hình Spring của tôi cho phép để tự động bơm một lớp Predicate trong truy vấn:mùa xuân - Nâng cao so sánh để hỗ trợ QueryDsl

@RequestMapping(method = RequestMethod.GET, path="/find") 
public ResponseEntity<PagedResources<FooResource>> find(Pageable pageable, PagedResourcesAssembler<Foo> assembler, @QuerydslPredicate(root = Foo.class) Predicate predicate) { 
    Page<Foo> foos = fooRepository.findAll(predicate, pageable) 
    final ResourceAssemblerSupport<Foo, FooResource> fooResourceAssembler = new ....; 
    final PagedResources<FooResource> pagedResources = assembler.toResource(foos, fooResourceAssembler); 
    return new ResponseEntity<>(pagedResources, HttpStatus.OK); 
} 

Sau đó, tôi có thể dễ dàng tìm kiếm khi thực hiện các yêu cầu GET:

GET /foo/name?=bob&name=alice&age=20 

Điều này làm việc tốt. Tuy nhiên tôi đã tự hỏi làm thế nào để đạt được tiêu chí tìm kiếm cao cấp hơn:

  • >
  • <
  • >=
  • <=

Thông thường tôi muốn áp dụng những nhà khai thác trường số và ngày trong các mô hình dữ liệu của tôi. Các loại tiêu chí này được hỗ trợ trong Querydsl.

Tôi đã thử thêm > (%3E) trong tham số truy vấn của tôi, nhưng nó vẫn thất bại phân tích cú pháp (ví dụ cho trường số như tuổi tác nó than phiền nó không thể phân tích cú pháp >10 như một số.

Có thể sử dụng toán tử này trực tiếp trong truy vấn?

(Trong trường hợp những vấn đề tôi đang sử dụng Spring dữ liệu MongoDB)

+0

Bạn đã bao giờ tìm cách triển khai tính năng này chưa?Tôi đã cố gắng để thực hiện một cái gì đó tương tự, nhưng không thành công. – woemler

+1

@woemler Tôi đã thực sự đỗ vấn đề đó ngay bây giờ nhưng nó không biến mất. Tôi nghĩ rằng tôi sẽ kết thúc viết mã của riêng tôi để phân tích cú pháp de tham số truy vấn. Tôi cần phải kiểm tra xem có cách nào dễ dàng để tích hợp nó với cơ chế tiêm xuân không. Khi tôi nhận được để làm điều đó tôi có thể sẽ yêu cầu tư vấn về kho lưu trữ github mùa xuân. Sẽ viết nó ở đây như là một câu trả lời nếu tôi tìm thấy một cái gì đó thú vị – phoenix7360

Trả lời

1

Tuỳ chỉnh Query DSL ràng buộc - lớn hơn so

Những gì bạn có thể làm là xác định QueryDSL của riêng bạn Binding trong kho của bạn, bằng cách mở rộng QueryDslPredicateExecutorQuerydslBinderCustomizer:

public interface FooRepository 
     extends CrudRepository<Foo, Integer>, QueryDslPredicateExecutor<Foo>, QuerydslBinderCustomizer<QFoo> { 

    default void customize(final QuerydslBindings bindings, final QFoo foo) { 
     SingleValueBinding<NumberPath<Integer>, Integer> singleBinding = new SingleValueBinding<NumberPath<Integer>,Integer>(){ 
      @Override 
      public Predicate bind(NumberPath<Integer> path, Integer ageValue) { 
       return path.gt(ageValue); 
      } 
     }; 

     bindings.bind(foo.age).first(singleBinding); 
    } 
} 

Tôi không phải chuyên gia Query DSL, nhưng hiểu biết của tôi là như sau:

một binding xác định cách một trường cụ thể được so sánh với cột cơ sở dữ liệu của nó.

Cùng một ràng buộc với java 8 lambda: (path, ageValue) -> path.gt(ageValue). Bạn phải đọc mã trong phương thức tùy chỉnh từ phối cảnh của thông số url:

tìm nạp Foos mà tuổi được cung cấp làm tham số lớn hơn giá trị của cơ sở dữ liệu.

Tuỳ chỉnh Query DSL ràng buộc - giữa so

Một lựa chọn khác là cung cấp thấp hơn và giới hạn trên cho tham số của bạn, như thế này: ?age=10&age=30. Sau đó, xác định ràng buộc sau:

default void customize(final QuerydslBindings bindings, final QFoo foo) { 
    bindings.bind(foo.age).all((path, ageValue) -> { 
     Iterator<? extends Long> it = value.iterator(); 
     return path.between(it.next(), it.next()); 
    }); 
} 
+0

Đó là thú vị. Vấn đề duy nhất là điều này không cho phép tùy chỉnh phân tích cú pháp thực tế của biểu thức. Bởi vì cách các kiểu dữ liệu được thiết lập, nó không thể có một trường int nhưng phân tích một String (ví dụ có chứa ">"). điều này dường như là một hạn chế của mùa xuân. – phoenix7360

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