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

tkqqtvp1  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(48)

对于我的字符串查询参数,我可以使用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));

字符串
我的URL:

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


我会得到一辆车与使:丰田和型号:凯美瑞
但是如果我想使用多值查询参数进行搜索:

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


只有第一个查询参数使用了不区分大小写并包含搜索。所以,我得到了Toyota,但我不会得到本田。这是预期的,因为API指定了first
我找到了all,但我如何使用它来忽略大小写并使用contains?下面是我想做的,但这不起作用,因为path不是StringPath

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

8i9zcol2

8i9zcol21#

这可以通过以下方式实现:

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

字符串

相关问题