【发布时间】:2020-03-09 02:01:27
【问题描述】:
Spring (Boot) Data Rest 和 QueryDsl 是否可以跨多个列执行“或”搜索?我已经自定义了我的绑定,以便在多次出现相同的搜索路径时执行“或”搜索(MultiValueBinding)。 myentity?name=foo&name=bar 将返回 name 属性包含 foo 或 bar 的所有实体。
@Entity
MyEntity {
@Id
Long id;
String name;
String email;
}
@RepositoryRestResource(path = "myentity")
public interface MyEntityRepository extends CrudRepository<MyEntity, Long>, ,
QuerydslPredicateExecutor<MyEntity>, QuerydslBinderCustomizer<QMyEntity> {
@Override
default void customize(QuerydslBindings bindings, QMyEntity root) {
bindings.bind(root.id).first(NumberExpression::eq);
bindings.bind(String.class).all((StringPath path, Collection<? extends String> values) -> {
BooleanBuilder predicate = new BooleanBuilder();
values.forEach(value -> predicate.or(path.containsIgnoreCase(value)));
return Optional.of(predicate);
});
}
}
如果不实现自定义控制器,是否可以通过“或”连接多个路径中的搜索,以便myentity?name=foo&email=bar 将返回名称属性包含“foo”的结果或电子邮件属性包含“酒吧”。或者定义一个自定义路径,然后用于在多列中进行搜索?例如myentity?nameOrEmail=foo。
【问题讨论】:
-
我已经自定义了我的绑定,以便在多次出现相同的搜索路径时执行“或”搜索。顺便说一句,这应该是默认行为,不需要任何绑定自定义。
-
@AlanHay 感谢您提供的信息,我在阅读文档时错过了这一点。仅当您需要与 equals 不同的表达式时(例如我的示例中的 containsIgnoreCase),才需要绑定自定义。 docs.spring.io/spring-data/jpa/docs/current/reference/html/…
标签: java spring-boot spring-data spring-data-rest querydsl