2016-08-19 3 views
5
official documentation 다음

고급 비교기, 내 스프링 구성에 @EnableSpringDataWebSupport 주석을 추가 자동으로 쿼리에서 Predicate 클래스를 주입 할 수 있습니다봄 QueryDsl 지원

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

잘 작동합니다. 그러나 나는 더 많은 고급 검색 기준을 달성하는 방법을 궁금 해서요 :

  • >
  • <
  • >=
  • <=
  • 일반적으로

나는 숫자와 날짜 필드에 이러한 연산자를 적용 할 것 내 데이터 모델에서. 이러한 종류의 기준은 Querydsl에서 지원됩니다.

나는 내 쿼리 매개 변수에 > (%3E)를 추가하는 시도하지만 그것은 숫자로 >10을 구문 분석 할 수 없습니다 불평 나이와 같은 숫자 필드 (예를 들어, 구문 분석 실패.

이 가능 쿼리에서 직접이 연산자를 사용할 수 있나요?

+0

이것을 구현하는 방법을 찾았습니까?비슷한 것을 구현하려고했지만 성공하지 못했습니다. – woemler

+1

@woemler 나는 실제로 그 문제를 지금까지 주차했지만 멀리 가지 않을 것입니다. 나는 쿼리 매개 변수를 파싱하기 위해 내 자신의 코드를 작성하게 될 것이라고 생각한다. 스프링 주입 메커니즘과 쉽게 통합 할 수 있는지 확인해야합니다. 그렇게 할 때 스프링 github 저장소에 대한 조언을 요청할 것입니다. 흥미로운 것을 발견하면 대답으로 쓰겠습니다. – phoenix7360

답변

1

사용자 정의 쿼리 DSL (여기서 내가 봄 데이터 MongoDB를 사용하고 중요한) 바인딩 - 비교보다 큰

당신이 QueryDslPredicateExecutorQuerydslBinderCustomizer 확장하여 자신의 QueryDSL, 당신의 저장소에 바인딩 정의되어 수행 할 수 있습니다

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

내가 어떤 쿼리 DSL 전문가는 아니지만을하지만 나의 이해는 다음과 같다 :

을 바인딩은 특정 필드를 데이터베이스 열과 비교하는 방법을 정의합니다.

자바 8의 동일한 바인딩 : lambda : (path, ageValue) -> path.gt(ageValue). 당신은 url 매개 변수의 관점에서 사용자 정의 방식의 코드를 읽을 수 있습니다

가 매개 변수로 제공되는 연령보다 큰 데이터베이스의 가치 인을위한, FOOS를 가져옵니다.

사용자 정의 쿼리 DSL 바인딩 - 비교 사이

또 다른 옵션은 다음과 같이 낮은과 매개 변수에 대한 상한을 제공하는 것입니다 : ?age=10&age=30. 그런 다음 다음 바인딩을 정의하십시오.

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

재미 있습니다. 유일한 문제는이 표현식의 실제 구문 분석을 사용자 정의 할 수 없다는 것입니다. 데이터 유형이 설정되는 방식 때문에 int 필드는 가질 수 없지만 String (예 : ">"포함)을 파싱하는 것은 불가능합니다. 이것은 봄의 한계 인 것 같다. – phoenix7360