我有以下需求查询:
“/文章?类别 =厨房和类别 =运动”
此查询无需自定义绑定即可运行。它将给我所有关于厨房和体育的文章作为回应。它正在以某种方式进行“或”操作。
但是我需要自定义绑定,因为我需要阅读案例。现在我正在使用此自定义绑定:
@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));
}
}
这只会过滤属性的第一个可用的值。因此,在这种情况下,它仅将类别Kitchen中的文章作为Response。类别(运动)的第二个值将被忽略。
现在我的问题是:我如何才能忽略对区分大小写的要求而同时获得和的文章?我需要在自定义绑定中进行哪些更改才能实现?
非常感谢你
最佳答案
QuerydslBindings.TypeBinder#first使用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) );
});
}