使用QuerydslBinderCustomizer,如何为所有String多值查询参数指定containsIgnoreCase?

问题描述 投票:0回答:1

对于我的字符串查询参数,我可以使用

QuerydslBinderCustomizer
:

轻松执行不区分大小写并包含的搜索
public interface CarRepository extends ReadOnlyRepository<Car, Integer>, QuerydslPredicateExecutor<Car>, QuerydslBinderCustomizer<QCar> {
    
    @Override
    default public void customize(QuerydslBindings bindings, QCar car) {

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

所以,对于我的网址:

http://my-service/cars?make=toy&model=cam

我会买一辆品牌:丰田,型号:凯美瑞的汽车

但是如果我想使用多值查询参数进行搜索:

http://my-service/cars?make=toy&make=hond

只有第一个查询参数使用不区分大小写并包含搜索。所以,我会买丰田,但不会买本田。但这是预期的,因为 API 指定了

first

我找到了

all
,但是如何使用它来忽略大小写并使用包含?这是我想做的,但这不起作用,因为路径不是
StringPath
:

        bindings.bind(String.class).all(
                (path, value) -> path.containsIgnoreCase(value));
spring spring-boot spring-data-jpa spring-data querydsl
1个回答
0
投票

这可以按如下方式完成:

public interface CarRepository extends ReadOnlyRepository<Car, Integer>, QuerydslPredicateExecutor<Car>, QuerydslBinderCustomizer<QCar> {
    
    @Override
    default public void customize(QuerydslBindings bindings, QCar car) {

        bindings.bind(String.class).all(
                (StringPath path, Collection<? extends String> all) -> {
        
                BooleanBuilder predicate = new BooleanBuilder();
                all.forEach(value -> 
                     predicate.or(path.containsIgnoreCase(value)));
                return Optional.of(predicate);          
       });
© www.soinside.com 2019 - 2024. All rights reserved.