【发布时间】:2017-12-06 15:46:50
【问题描述】:
我有一个由以下存储库公开的实体:
public interface InsertRepository extends PagingAndSortingRepository<InsertEntity, Long>, QueryDslPredicateExecutor<InsertEntity>, QueryDslBinderCustomizer<QInsertEntity> {
@Override
default void customize(QuerydslBindings bindings, QInsertEntity insert) {
bindings.bind(String.class).all(StringPath path, Collection<? extends String> values) -> {
BooleanBuilder predicate = new BooleanBuilder();
values.forEach(value -> predicate.or(path.containsIgnoreCase(value)));
return predicate;
});
}
}
我希望它做的是所有 GET 查询参数都链接为逻辑 OR,以便像 ?description=searchText&customerName=searchText 这样的查询将执行如下所示的 SQL 查询:
WHERE description LIKE '%searchText%' OR customerName LIKE '%searchText%'
但是,我一定做错了什么,因为它不起作用 - 它将所有查询参数放入 AND 查询中。这将导致仅选择那些在 customerName AND 中包含 searchText 的记录。
【问题讨论】:
-
TypeBinder$all() 允许您自定义按路径或按类指定的多值绑定。但即使您“按类”自定义绑定,查询参数也不会被全局处理。例如
-
@MarcTarin 好的,如果我理解正确,我无法使用
customize方法完成我需要的工作,对吧? -
例如
?description=searchText&description=searchInt会给你WHERE description LIKE '%searchText%' OR description LIKE '%searchInt%'。customerName的出现被作为一个单独的子句处理,所有子句都用 AND 连接。所以不,据我所知,您无法使用customize方法完成您需要的工作。 -
好的,非常感谢 - 我想我会为此使用自定义查询。
标签: java spring spring-data-rest querydsl