我将休眠状态从版本4.3.7
迁移到5.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<>());
}
因此,在数据库中,bcCode
具有类型String
,值00437
,22437
和clearingNumber = 437。
在休眠版本4.x
中,它可以通过bcCode = 00437
获得结果。
在版本5.x
中,除非输入为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));
答案 0 :(得分:0)
一开始它不应该起作用。您可能很幸运,知道如何将字符串转换为整数。
将String与int比较不是很聪明。我会手动将字符串转换为int,然后进行比较。或者,您需要以某种方式删除bcCode中的所有尾随空格,然后将它们作为字符串与字符串进行比较。