如何将JPA中的自定义函数转换为谓词?
我有一个自定义的函数实现(接口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'
所以它是某种谓词。 我正在以下列方式使用该function:
ParameterExpression parameterExpression = criteriaBuilder.parameter(String.class); criteriaBuilder.function("filter", String.class, parameterExpression));
我想使用disjunction与几个这样的函数将它们的数组传递给CriteriaBuilder.or
。 该函数是一个Expression
实现。 但CriteriaBuilder.or
采用了一系列Predicate
的。 我试图将这样的函数转换为Predicate
但我在运行时得到了Predicate
转换exception。
我试图在CriteriaBuilder.isTrue
包装此函数。 然后我必须指定函数Boolean.class
的返回类型而不是String.class
但是我得到另一个运行时exception,说它不能将我的函数转换为boolean。
我必须这样做,因为我必须使用JPA Criteria API。
如何在CriteriaBuilder.or
链接这些函数? 非常感谢你!