2017-05-03 56 views
0

我使用QuerydslPredicate(Spring 4.2.5,Spring Boot 1.3.3,querydsl-core 3.7.0)來創建搜索Web服務。 我的Ticket實體擁有類似namedescription等屬性。 我希望在name字段上有一個嚴格的等式,但description上的「包含」比較。在春季覆蓋條件QuerydslPredicate

Web服務

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

問題:當我查詢一樣,我的web服務:http...?description=foo,都爲description產生兩個比較(我開始調試,看着產生BooleanBuilder)。僞代碼如下所示:「description = foo AND description contains foo」。
我想只保留「包含」比較。

我發現了一個解決方法:我只是將web服務的參數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

請回答一個實際的回答你的問題,以提高可見度,讓讀者(見https://stackoverflow.com/help/self-answer )。 –

回答

0

我找到了解決辦法:我TicketRepository應該延伸QuerydslBinderCustomizer

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