JPA:如何在静态JPA元模型中对数字列执行LIKE操作?

4

我有一个静态元模型,其中包含一个数字列(实际上是 BigDecimal,不要问为什么)。现在我想对该数字列执行 LIKE 查询:

CriteriaBuilder cb;
cb.like(entity.get(Entity_.numbercol), "123%");

在此处,entity.get(Entity_.numbercol)返回了一个Path<BigDecimal>。自然而然地,我会得到编译错误:...like(Expression<String>, ...) ... not applicable for the arguments (Path<BigDecimal>, ...)

使用.as(String.class)将列转换为字符串类型时由于JPA中的某些Bug,该方法失败了,但我现在手头没有该Bug编号。尽管如此,在最新版本的JPA / Hibernate中它仍未被修复。无论如何,这会导致生成一条有关某些无效SQL语句的运行时异常。

现在我只需要找到一种获取与SQL等效的标准API的方法。

... WHERE numbercol LIKE '123%';

搜索该主题已经得到以下回复,但由于我有一个静态元模型,所以它们没有帮助: NHibernate-Criteria API中执行LIKE搜索整数列的最简单方法?JPA/Criteria API-Like&equal问题 有什么想法吗?
提前致谢 Dominik

作为一种解决方法,因为通配符始终是搜索字符串/数字的最后一个字符,我创建了一堆between表达式,例如对于123%,我有= 123 OR between(1230,1239)OR between(12300,12399)OR between(123000,123999)等等。虽然不是最好的方法,但至少它能够工作。 - Dominik Sandjaja
2个回答

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) + ')';
    }
}

然后将其使用:

cb.like(new StrFunction<Long> (cb, root.get(MyObject_.id)), "%mySearchTerm%");

0

不,它不是因为错误而失败,它按照指定的方式工作(例如在Javadoc中):

对表达式执行类型转换,返回一个新的表达式对象。此方法不会导致类型转换:运行时类型不会更改。警告:可能会导致运行时失败。

您使用的方法执行强制转换,但您需要进行转换。通常,在JPA中没有支持从BigDecimal到String的转换。


嗯,我知道那个问题,但我们也可能会忽略其他的错误。不管怎样,在这个情境下指出来真的很有帮助,谢谢。 - Dominik Sandjaja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接