我使用QuerydslPredicate(Spring 4.2.5,Spring Boot 1.3.3,querydsl-core 3.7.0)來創建搜索Web服務。 我的Ticket
實體擁有類似name
,description
等屬性。 我希望在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
字段上覆蓋默認的相等性?
請回答一個實際的回答你的問題,以提高可見度,讓讀者(見https://stackoverflow.com/help/self-answer )。 –