3

我确实有一个带有 NUMBER(实际上是 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>, ...)

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

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

... WHERE numbercol LIKE '123%';

搜索该主题时已经出现以下响应,这些响应无济于事,因为我有一个静态元模型: NHibernate - 使用 Criteria API 对整数列进行 LIKE 搜索的最简单方法?JPA/Criteria API - Like & equal 问题

有任何想法吗?

在此先感谢多米尼克

4

2 回答 2

12

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

知道 HQLstr函数可以完成这项工作(至少对于 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%");
于 2013-10-22T11:38:22.840 回答
0

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

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

您使用的方法执行转换并且您需要转换。一般来说,JPA 中不支持从 BigDecimal 转换为 String。

于 2012-03-22T06:49:07.347 回答