Spring Data Rest中带有QueryDsl的多列“ OR”

Spring(Boot)Data Rest和QueryDsl是否可以跨多个列执行“或”搜索?我已经自定义了绑定,以便当多次出现相同的搜索路径时将执行“或”搜索(MultiValueBinding)。 myentity?name=foo&name=bar将返回name属性包含foobar的所有实体。

@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返回结果,其中name属性包含“ foo”,电子邮件属性包含“栏”。或者定义自定义路径,然后将其用于多列搜索?例如myentity?nameOrEmail=foo

ts2011 回答:Spring Data Rest中带有QueryDsl的多列“ OR”

您可以只使用这个库:https://github.com/turkraft/spring-filter

它将让您运行搜索查询,例如:

/search?filter= average(评分)> 4.5 brand.name ('奥迪'、'路虎')(年份> 2018公里 50000)和颜色“白色”事故为空

您也可以检查https://github.com/jirutka/rsql-parser,但它有点过时

,

尝试使用此实现:

@Override
default void customize(QuerydslBindings bindings,QDocument root) {

StringPath[] multiPropertySearchPaths = new StringPath[] {root.prop1,root.prop2,root.prop3};

/**
 * Binds prop1,prop2 and prop3 in OR clause
 * This binding will activate when one of the given properties are searched in query params
 */
bindings.bind(multiPropertySearchPaths).all(new MultiValueBinding<StringPath,String>() {
    @Override
    public Predicate bind(StringPath path,Collection<? extends String> values) {
        BooleanBuilder predicate = new BooleanBuilder();
        // Bind paths present in array multiPropertySearchPaths with incoming values
        for (StringPath propertyPath : multiPropertySearchPaths) {
            values.forEach(value -> predicate.or(propertyPath.containsIgnoreCase(value)));
        }
        return predicate;
    }
});
}

它将生成类似sql的

select * from document
where
    lower(document.prop1) like ?1 
    or lower(document.prop2) like ?1 
    or lower(document.prop3) like ?1
本文链接:https://www.f2er.com/3111274.html

大家都在问