привет!Я пытаюсь создать пользовательский фильтр для сетки данных во время выполнения.Я использую Spring Boot и Vaadin 8 для представления данных.Знания Ваадина не имеют отношения к этому вопросу.
Как я работаю: я построил хэш-карту для фильтров.
private HashMap<String, Specification<ARInteraction>> interactionSpecifications =
new HashMap<>();
Каждое текстовое поле фильтра добавляет или удаляет спецификацию к карте:
TextField filterOwner = new TextField("Filter");
filterOwner.addValueChangeListener(nv -> {
if (StringUtils.isNotEmpty(nv.getValue())) {
interactionSpecifications.put("owner", ARInteractionSpecifications
.withOwnerEmail(nv.getValue()));
} else {
interactionSpecifications.remove("owner");
}
refreshContent();
});
Когда данные поля изменяются, пользовательская спецификация добавляется или заменяется (или удаляется) из карты спецификаций.
Затем я вызываю, чтобы обновить содержимое представления данных, которое вызываетзапрос для извлечения данных для запуска.
Чтобы создать спецификацию для запроса данных, я просто добавляю все спецификации, применяя между ними операцию 'и'.
private Specification<ARInteraction> buildSpecification() {
// No specs
if (interactionSpecifications.isEmpty())
return null;
// Assembles all specs together
Specification<ARInteraction> ret = null;
for (Specification<ARInteraction> spec : interactionSpecifications.values()) {
if (ret == null) {
ret = Specification.where(spec);
} else {
ret.and(spec);
}
}
return ret;
}
я ожидал, что при применении обоих фильтров извлекаются только те, которые соответствуют обеим спецификациям .
Что на самом деле происходит , так это еслиЯ устанавливаю только спецификацию состояния (здесь не показано), она работает, если я устанавливаю фильтр электронной почты владельца, он также работает, но если я устанавливаю оба, все взаимодействия от этого владельца отображаются , игнорируя статус fМСДЭНИ .