Как конвертировать пользовательскую функцию в JPA в предикат? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть пользовательская реализация функции (интерфейс SQLFunction), которая выглядит следующим образом:

public class FilterFunction implements SQLFunction {

    @Override
    public boolean hasArguments() {
        return true;
    }

    @Override
    public boolean hasParenthesesIfNoArguments() {
        return false;
    }

    @Override
    public Type getReturnType(Type firstArgumentType, Mapping mapping) throws QueryException {
        return StandardBasicTypes.STRING;
    }

    @Override
    public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor factory) throws QueryException {
        return arguments.get(0).toString();
    }
}

Так что она просто берет параметр и заменяет функцию им.SQL может выглядеть так:

HUGE_SQL = 'SOME_VALUE' AND HUGE_SQL2 = 'SOME_VALUE'

Так что это какой-то предикат.Я использую функцию следующим образом:

ParameterExpression parameterExpression = criteriaBuilder.parameter(String.class);
criteriaBuilder.function("filter", String.class, parameterExpression));

Я хотел бы использовать дизъюнкцию с несколькими такими функциями, передавая массив из них CriteriaBuilder.or.Функция является реализацией Expression.Но CriteriaBuilder.or принимает массив Predicate.Я пытался преобразовать такую ​​функцию в Predicate, но я получаю исключение приведения во время выполнения.

Я пытался обернуть эту функцию в CriteriaBuilder.isTrue.Затем я должен указать тип возвращаемого значения функции Boolean.class вместо String.class, но затем я получаю еще одно исключение времени выполнения, в котором говорится, что он не может преобразовать мою функцию в логическое значение.

Я должен это сделатьпотому что я должен использовать JPA Criteria API.

Как мне связать такие функции в CriteriaBuilder.or?Большое спасибо!

...