QueryDSL MultiValueBinding возможно с несколькими типами? - PullRequest
1 голос
/ 12 марта 2020

Я работаю с SpringBoot Rest API в Java, и у меня есть IssueRepository для сущностей Issue, который расширяет QuerydslPredicateExecutor и QuerydslBinderCustomizer. Каждый объект проблемы связан с объектом последних действий, который содержит логическое поле isClosed. Я хочу найти все проблемы, которые не закрыты, поэтому либо проблема не имеет последней активности, либо последней активности, где isClosed = false. Мой веб-интерфейс создает URL для представления этого: /api/issues&latestActivity.isClosed=0&latestActivity=-1.

Я хочу использовать привязки QueryDsl для ИЛИ этих двух условий вместе, используя MultiValueBinding, как описано в Привязки предикатов QueryDSL "или" между несколькими путями . Это предлагаемое решение:

@Override
default void customize(QuerydslBindings bindings, QDocument root) {

StringPath[] multiPropertySearchPaths = new StringPath[] {root.prop1, root.prop2, root.prop3};

/**
 * Binds prop1, prop2 and prop3 in OR clause
 * This binding will activate when one of the given properties are searched in query params
 */
bindings.bind(multiPropertySearchPaths).all(new MultiValueBinding<StringPath, String>() {
    @Override
    public Predicate bind(StringPath path, Collection<? extends String> values) {
        BooleanBuilder predicate = new BooleanBuilder();
        // Bind paths present in array multiPropertySearchPaths with incoming values
        for (StringPath propertyPath : multiPropertySearchPaths) {
            values.forEach(value -> predicate.or(propertyPath.containsIgnoreCase(value)));
        }
        return predicate;
    }
});
}

Моя проблема в том, что я не могу определить multiPropertySearchPaths или MultiValueBinding, потому что мои пути имеют два разных типа (issue.latestActivity - это путь к сущности, но issue.latestActivity.isClosed это логический путь).

Есть ли способ использовать MultiValueBinding или какую-либо другую функцию QueryDsl для ИЛИ двух полей разных типов?

...