2017-05-03 4 views
0

Ich benutze QuerydslPredicate (Frühjahr 4.2.5, Spring Boot 1.3.3, Querydsl-Core 3.7.0), um einen Such-Web-Service zu erstellen. Meine Ticket Einheit verfügt über Eigenschaften wie name, description usw. ich eine strikte Gleichheit will auf das name Feld, sondern ein „enthält“ Vergleich auf den description.Override-Bedingung im Frühjahr QuerydslPredicate

Der Webservice

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

Problem: wenn ich so meine Web-Service-Abfrage: http...?description=foo werden zwei Vergleiche für die description erzeugt (Ich begann einen Debugger und schaute auf die erzeugte BooleanBuilder). Der Pseudocode sieht so aus: "description = foo AND description enthält foo".
Ich möchte nur den "enthält" Vergleich behalten.

Ich habe eine Problemumgehung gefunden: Ich habe einfach Web Service-Parameter description in descriptionFragment umbenannt. Auf diese Weise kann ich http...?descriptionFragment=foo anrufen.

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

Frage: Ich möchte diese Problemumgehung vermeiden. Gibt es eine Möglichkeit, die Standardgleichheit für das Feld description zu überschreiben?

+0

Sie bitte Ihre Frage in einer tatsächlichen Antwort, für SO Leser Sichtbarkeit zu erhöhen (siehe https://stackoverflow.com/help/self-answer). –

Antwort

0

ich eine Lösung gefunden: meine TicketRepository sollte sich QuerydslBinderCustomizer

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