我有一个自定义的函数实现(接口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
中链接此类功能?非常感谢你!