我有一个通用的Spring Data仓库接口,它扩展了QuerydslBinderCustomizer
,使我能够自定义查询执行。我正在尝试扩展默认仓库实现中内置的基本相等性测试,以便我可以使用Spring Data REST执行其他查询操作。例如:
GET /api/persons?name=Joe%20Smith // This works by default
GET /api/persons?nameEndsWith=Smith // This requires custom parameter binding.
我遇到的问题是,我创建的每个实体路径的别名似乎都会覆盖先前的别名绑定。
@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable>
extends PagingAndSortingRepository<T, ID>, QueryDslPredicateExecutor<T>, QuerydslBinderCustomizer {
@Override
@SuppressWarnings("unchecked")
default void customize(QuerydslBindings bindings, EntityPath entityPath){
Class<T> model = entityPath.getType();
Path<T> root = entityPath.getRoot();
for (Field field: model.getDeclaredFields()){
if (field.isSynthetic()) continue;
Class<?> fieldType = field.getType();
if (fieldType.isAssignableFrom(String.class)){
// This binding works by itself, but not after the next one is added
bindings.bind(Expressions.stringPath(root, field.getName()))
.as(field.getName() + "EndsWith")
.first((path, value) -> {
return path.endsWith(value);
});
// This binding overrides the previous one
bindings.bind(Expressions.stringPath(root, field.getName()))
.as(field.getName() + "StartsWith")
.first((path, value) -> {
return path.startsWith(value);
});
}
}
}
}
是否可以为同一字段创建多个别名?这可以以通用的方式完成吗?
private final Map<String, PathAndBinding<?, ?>> pathSpecs
,这就解释了为什么bindings.bind(Expressions.stringPath(root, field.getName()))
会覆盖先前的绑定。不过我不知道是否有其他方法可以实现这个功能。 - Alan Hay/search/users?emails.value=endsWith(@company.com)&emails.value=endsWith(@legacycompany.com)
,有一个项目可以提供这些操作符:https://gt-tech.bitbucket.io/spring-data-querydsl-value-operators/README.html。 - hakamairi