对于我的字符串查询参数,我可以使用
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));
这可以按如下方式完成:
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);
});