2017-05-03 4 views
0

저는 검색 웹 서비스를 만들기 위해 QuerydslPredicate (Spring 4.2.5, Spring Boot 1.3.3, querydsl-core 3.7.0)를 사용하고 있습니다. 내 Ticket 엔티티의 속성은 name, description 등입니다. name 필드에는 완전 항등식을 사용하지만 description에는 "포함"비교를 원합니다.Spring QuerydslPredicate에서 조건을 재정의

웹 서비스

public Page<Ticket> findAll(@QuerydslPredicate(root = Ticket.class) Predicate predicate, String description) { 
    BooleanBuilder builder = new BooleanBuilder(predicate); 
    if (isNotEmpty(description)) { 
     builder.and(QTicket.ticket.description.containsIgnoreCase(description)); 
    } 
    return ticketService.findAll(builder, pageable); 
} 

문제 : 나는 그런 내 웹 서비스 쿼리 할 때 : http...?description=foo, 두 비교가 description 생성됩니다 (나는 디버거를 시작하고 생성 된 BooleanBuilder 보았다). 의사 코드는 다음과 같이 보입니다 : "description = foo AND description에 foo가 들어 있습니다".
"포함"비교 만하고 싶습니다.

웹 서비스의 매개 변수 description의 이름을 descriptionFragment으로 변경했습니다. 이렇게하면 http...?descriptionFragment=foo으로 전화 할 수 있습니다.

public Page<Ticket> findAll(@QuerydslPredicate(root = Ticket.class) Predicate predicate, String descriptionFragment) { 
    BooleanBuilder builder = new BooleanBuilder(predicate); 
    if (isNotEmpty(descriptionFragment)) { 
     builder.and(QTicket.ticket.description.containsIgnoreCase(descriptionFragment)); 
    } 
    return ticketService.findAll(builder, pageable); 
} 

질문 :이 해결 방법을 피하고 싶습니다. description 필드에서 기본 동등성을 무시할 수있는 방법이 있습니까?

내가 해결책을 발견
+0

를 확장). –

답변

0

: 내 TicketRepository는해야는 (https://stackoverflow.com/help/self-answer를 참조 SO 독자에 대한 가시성을 높이기 위해 실제 대답 질문에 답변 해주세요 QuerydslBinderCustomizer

@Override 
default void customize(QuerydslBindings bindings, QTicket qTicket) { 
    bindings.bind(qTicket.description).first(StringExpression::containsIgnoreCase); 
}