2017-03-09 49 views
1

我有以下要求查詢:春與查詢的Dsl定製的約束力和或操作不起作用

「?/條類別 =廚房& 類別 =運動」

此查詢工作沒有自定義綁定。它會給我所有的廚房和體育用品作爲迴應。它以某種方式進行OR操作。

但我需要自定義綁定,因爲我需要ingore案件。我現在用的這個自定義綁定:

@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忽略案件感性?我需要在自定義綁定中更改以實現該功能?

非常感謝您

回答

2

QuerydslBindings.TypeBinder#首先使用single value binding。您需要使用QuerydslBindings.TypeBinder#all。此方法在 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)); 
    }); 

} 
+0

您在代碼中使用了.first。認爲這是一個錯字:) –

+0

實際上,你的例子不起作用。我不能使用.all()mehtod:類型QuerydslBindings.PathBinder 中的方法all(MultiValueBinding )不適用於參數(( path, values) - > {} ) –

+0

如果我沒有記錯,它確實無法與'bind(類類型)'參數一起使用,但它應該可以與'bind(T ... paths)'一起工作。 –

0

經過一個很好的搜索後,我找到了解決方案。

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; 
     } 
    });