java - Hibernate 5无法将字符串与int进行比较
问题描述
我将休眠从版本迁移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<>());
}
所以在 DB 中,bcCode
有 type 、String
values和 clearingNumber = 437。00437
22437
在休眠版本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));
解决方案
它一开始不应该起作用。你可能很幸运你的字符串是如何转换成整数的。
比较 String 和 int 不是很聪明。我会手动将字符串转换为 int,然后进行比较。或者您需要以某种方式删除 bcCode 中的所有尾随空格,然后将它们作为字符串与字符串进行比较。
推荐阅读
- nosql - couchbase n1ql 更新在更新时出现错误 3000
- python - 为什么 __getattribute__ 应该引发 AttributeError 异常?
- python - 无法导入 C:\Users\username\Anaconda3\python.exe 时,如何在 Pycharm 中访问 Anaconda 基础环境?
- javascript - 文本在 div 外部流动,溢出 + 在父 div 底部定位 div(溢出)
- reactjs - 如何从material-ui react改变Paper组件的borderColor?
- python - PYNQ-Z1:如何使用基本覆盖将视频从 HDMI 输入流式传输到 HDMI 输出?
- ios - iOS:使“位置”出现在应用设置中而不请求位置授权(Tile 应用示例)
- javascript - 我可以使用 chrome 开发人员工具更新 android 应用程序的远程 javascript 文件吗?
- etl - 有什么方法可以合并行以在 Talend Open Studio 中填充空值?
- typescript - Visual Studio 2019 中 Jasmine 的无用测试失败消息