JPA:如何在静态JPA MetaModel中使用NUMBER列执行LIKE?

Dom*_*aja 3 hibernate jpa criteria-api metamodel jpa-2.0

我确实有一个带有NUMBER(实际上是BigDecimal,不要问为什么)列的静态元模型.现在我想对该数字列进行LIKE查询:

CriteriaBuilder cb;
cb.like(entity.get(Entity_.numbercol), "123%");
Run Code Online (Sandbox Code Playgroud)

哪里entity.get(Entity_.numbercol)返回一个Path<BigDecimal>.当然,我得到一个编译错误:...like(Expression<String>, ...) ... not applicable for the arguments (Path<BigDecimal>, ...)

.as(String.class)由于JPA中存在一些错误而导致列失败,但我现在手头没有错误编号.但是,在最新版本的JPA/Hibernate中并没有修复它.无论如何,它会导致生成一些无效SQL语句的运行时异常.

现在我只需要一种方法来获得与SQL相当的标准API

... WHERE numbercol LIKE '123%';
Run Code Online (Sandbox Code Playgroud)

搜索主题已经提出了以下响应,这没有帮助,因为我有一个静态元模型: NHibernate - 使用Criteria API对整数列进行LIKE搜索的最简单方法?JPA/Criteria API - 喜欢和平等的问题

有任何想法吗?

在此先感谢Dominik

Ale*_*der 12

对于仍在寻找解决方案的人们.

知道HQL str函数完成了这项工作(至少对于Hibernate v.3.6.9.Final),可以实现自己的FunctionExpression:

//plagiarized from org.hibernate.ejb.criteria.expression.function.CastFunction
public class StrFunction<Y extends Number> extends BasicFunctionExpression<String> implements FunctionExpression<String>, Serializable {
    public static final String FCT_NAME = "str";

    private final Selection<Y> selection;

    public StrFunction(CriteriaBuilder criteriaBuilder, Selection<Y> selection) {
        super((CriteriaBuilderImpl) criteriaBuilder, String.class, FCT_NAME);
        this.selection = selection;
    }

    @Override
    public void registerParameters(ParameterRegistry registry) {
        Helper.possibleParameter(selection, registry);
    }

    @Override
    public String render(CriteriaQueryCompiler.RenderingContext renderingContext) {
        return FCT_NAME + '(' + ((Renderable) selection).render(renderingContext) + ')';
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

cb.like(new StrFunction<Long> (cb, root.get(MyObject_.id)), "%mySearchTerm%");
Run Code Online (Sandbox Code Playgroud)