如何将JPA中的自定义函数转换为谓词?

时间:2018-10-12 09:37:35

标签: java hibernate jpa hibernate-criteria criteria-api

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

0 个答案:

没有答案