У меня есть пользовательская реализация функции (интерфейс 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
?Большое спасибо!