我正在使用QuerydslPredicate(Spring 4.2.5,Spring Boot 1.3.3,querydsl-core 3.7.0)来创建搜索Web服务。
我的Ticket
实体包含name
,description
等属性。
我想在name
字段上严格平等,但在description
上进行“包含”比较。
网络服务
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”
我只想保持“包含”比较。
我找到了一种解决方法:我只是将网络服务的参数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应该扩展QuerydslBinderCustomizer
@Override
default void customize(QuerydslBindings bindings, QTicket qTicket) {
bindings.bind(qTicket.description).first(StringExpression::containsIgnoreCase);
}