在Spring QuerydslPredicate中覆盖条件

时间:2017-05-03 08:48:41

标签: spring predicate querydsl

我正在使用QuerydslPredicate(Spring 4.2.5,Spring Boot 1.3.3,querydsl-core 3.7.0)来创建搜索Web服务。 我的Ticket实体包含namedescription等属性。 我想在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字段的默认相等性?

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案:我的TicketRepository应该扩展QuerydslBinderCustomizer

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