Создание нескольких псевдонимов для одного и того же пути QueryDSL в Spring Данные
У меня есть общий интерфейс репозитория Spring, который расширяет 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);
});
}
}
}
}
Возможно ли создать более одного псевдонима для одного и того же поля? Можно ли это выполнить общим способом?
Ответы
Ответ 1
Вы можете создать временное свойство, привязанное к QueryDSL, следующим образом:
@Transient
@QueryType(PropertyType.SIMPLE)
public String getNameEndsWith() {
// Whatever code, even return null
}
Если вы используете процессор аннотаций QueryDSL, вы увидите "nameEndsWith" в классе метаданных Qxxx, так что вы можете связать его как любое постоянное свойство, но не сохраняя его.