Spring使用Query Dsl自定义绑定和/或操作不起作用

时间:2017-03-09 16:02:29

标签: java spring filter binding querydsl

我有以下reQuirement Query:

“/物品的类别 =厨房和安培;?的类别 =体育”

此查询无需自定义绑定即可运行。它会给我所有的厨房和体育文章作为回应。它正以某种方式进行OR运算。

但我需要自定义绑定,因为我需要进行案例处理。现在我正在使用这种自定义绑定:

@Repository
public interface ArticleRepository extends JpaRepository<Article, Long>, 
QueryDslPredicateExecutor<QArticle>, QuerydslBinderCustomizer<QArticle> {


 @Override
  default public void customize(QuerydslBindings bindings, QArticle article) {

     bindings.bind(String.class).first((StringPath path, String value) -> path.containsIgnoreCase(value));
  }
}

这仅过滤了attribut的第一个可用值。所以在这种情况下,它只提供类别厨房中的文章作为响应。该类别(体育)的第二个值被忽略。

现在我的问题:我如何才能获得两者 catergories的文章,忽略了案例敏感性?我需要在自定义绑定中更改以实现该目标吗?

非常感谢

3 个答案:

答案 0 :(得分:4)

QuerydslBindings.TypeBinder#首先使用single value binding。您需要使用QuerydslBindings.TypeBinder#all。这个方法在a上运行  multivalue binding

我提供了几个如何在answer中自定义绑定的示例。这样的事情对你有用:

@Override
default public void customize(QuerydslBindings bindings, QArticle article) {
    // using explicit path bindings
    bindings.bind(article.category).all((path, values) -> {
        BooleanBuilder predicate = new BooleanBuilder();
        // with a for loop
        for (String value : values) {
            predicate.or(path.containsIgnoreCase(value));
        }
    });

    // using a type binding
    bindings.bind(String.class).all((StringPath path, Collection<? extends String> values) -> {
        BooleanBuilder predicate = new BooleanBuilder();
        // oneliner with Java 8 forEach
        values.forEach( value -> predicate.or(path.containsIgnoreCase(value) );
    });

}

答案 1 :(得分:3)

Sub StartingProcedure() Dim oMyApp1 As New Class1 Set oMyApp1.cls1 = New DLLname.Class1 Call oMyApp1.cls1.DLLentry End Sub 属性的正确绑定应如下所示:

article.category

如果您不需要对参数进行任何操作(例如忽略大小写),您可以将其简化为:

bindings.bind(article.category).all((path, value) -> {
    BooleanBuilder predicate = new BooleanBuilder();
    value.forEach(o -> predicate.or(path.equalsIgnoreCase(o)));
    return Optional.of(predicate);
});

答案 2 :(得分:1)

经过仔细搜索后,我找到了解决方案。

 bindings.bind(String.class).all(new MultiValueBinding<StringPath, String> () {
        @Override
        public Predicate bind(StringPath path, Collection<? extends String> values) {
            BooleanBuilder predicate = new BooleanBuilder();
            values.forEach( value -> predicate.or(path.containsIgnoreCase(value)));
            return predicate;
        }
    });