首页 > 解决方案 > Hibernate 5无法将字符串与int进行比较

问题描述

我将休眠从版本迁移4.3.75.3.7 目前我的代码是这样的

public BcData findByBcCode(int clearingNumber) {
        CriteriaBuilder cb = getCriteriaBuilder();
        CriteriaQuery<BcData> query = cb.createQuery(BcData.class);
        Root<BcData> bcAlias = query.from(BcData.class);
        query.where(cb.equal(bcAlias.get(BcData_.bcCode), clearingNumber));
        return findSingle(query, new HashMap<>());
    }

所以在 DB 中,bcCode有 type 、Stringvalues和 clearingNumber = 437。0043722437

在休眠版本4.x中,它可以得到结果bcCode = 00437

在 version5.x中,结果为 null,除非输入为clearingNumber = 00437

所以问题是如何在4不更改参数类型的情况下获得与版本相同的结果(int clearingNumber)

谢谢。更新1:equal方法内部,它以输入参数为对象,所以一般可以比较多种输入参数

@Override
    @SuppressWarnings("SuspiciousNameCombination")
    public Predicate equal(Expression<?> x, Object y) {
        return new ComparisonPredicate( this, ComparisonOperator.EQUAL, x, y );
    }

更新 2:最后我找到了解决方案,我们应该在查询之前将 bcCode 解析为 int

Expression<Integer> bcCodeExpr = bcAlias.get(BcData_.bcCode).as(Integer.class);
query.where(cb.equal(bcCodeExpr, clearingNumber));

标签: javahibernatejpacomparehibernate-criteria

解决方案


它一开始不应该起作用。你可能很幸运你的字符串是如何转换成整数的。

比较 String 和 int 不是很聪明。我会手动将字符串转换为 int,然后进行比较。或者您需要以某种方式删除 bcCode 中的所有尾随空格,然后将它们作为字符串与字符串进行比较。


推荐阅读