Весенние спецификации "и" не работают - PullRequest
0 голосов
/ 08 июня 2018

привет!Я пытаюсь создать пользовательский фильтр для сетки данных во время выполнения.Я использую 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МСДЭНИ .

1 Ответ

0 голосов
/ 08 июня 2018

Как дела?

Поведение спецификаций является неизменным, поэтому вы должны назначать спецификацию ret с помощью операции and.Ошибка новичка.

for (Specification<ARInteraction> spec : interactionSpecifications.values()) {
    if (ret == null) {
        ret = Specification.where(spec);
    } else {
        ret = ret.and(spec); //Assign the ret so that specs are actually added.
    }
}
...