Hibernate3.2的count返回值的问题

本文探讨了从Hibernate3.0.x/3.1.x升级到3.2时遇到的问题,即某些SQL函数如count()的返回类型由Integer改为Long。此变更可能导致ClassCastException异常,并提供了相应的解决方案。
 我的代码如下
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer


经排查,最终确定:

由于我使用的是Hibernate 3.2版本,经确认,这个版本已经把以前返回 Integer的改成了 Long,
因为JPA里面的返回值规定是Long, Hibernate为了兼容这个,所以修改了返回值。

如果你从Hibernate 3.0.x/3.1.x升级到最新的3.2版,一定要注意,3.2版的很多sql函数如count(), sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。

这个变化主要是为了兼容JPA,可以在hibernate.org的最新文档中找到说明。

Hibernate Team也提供了一个与原来兼容的解决方案:

  Configuration classicCfg = new Configuration();
  classicCfg.addSqlFunction( "count", new ClassicCountFunction());
  classicCfg.addSqlFunction( "avg", new ClassicAvgFunction());
  classicCfg.addSqlFunction( "sum", new ClassicSumFunction());
  SessionFactory classicSf = classicCfg.buildSessionFactory();

 
在使用 HibernateJPA 等 ORM 框架时,`NumberFormatException: For input string` 是一种常见的运行时异常,通常出现在字段类型转换不匹配或数据源中存在非法字符串值的情况下。以下是对该问题的详细分析及解决方案。 ### 3.1 数据源中存在非法字符串值 当数据库字段值为字符串 `"null"`,而非 SQL 中的 `NULL` 值时,尝试将其转换为数值类型(如 `Integer.parseInt()` 或 `Long.valueOf()`)会抛出 `NumberFormatException`。例如从 MySQL 读取数据后转换为 Java 对象时,若字段值为 `"null"` 字符串而非 `null` 引用,将导致类型转换失败 [^2]。 **示例代码:** ```java int sum_mark; if (subjective_mark.equals("null")) { sum_mark = Integer.valueOf(objective_mark); } else { sum_mark = Integer.valueOf(subjective_mark) + Integer.valueOf(objective_mark); } ``` 在上述代码中,若 `subjective_mark` 为 `"null"` 字符串,则判断逻辑成立,可避免转换异常 [^2]。 ### 3.2 数据库字段与 Java 类型映射不匹配 当数据库字段类型为字符串(如 `VARCHAR`),而 Java 实体类中映射为数值类型(如 `Integer`),Hibernate 在加载数据时会尝试自动转换,若字段值无法解析为数字,将抛出 `NumberFormatException`。例如使用 `createSQLQuery` 查询时,若字段值为非数字字符串,将导致异常 [^3]。 **解决方案:** - 在 SQL 查询中显式转换字段类型,确保返回值为合法数字格式。 ```java .createSQLQuery("select CONVERT(varchar(100), _t1010.tf_createdate , 23) as id, count(*) as count from Global _t1010 " + "group by CONVERT(varchar(100), _t1010.tf_createdate , 23)"); ``` 该查询将日期字段转换为字符串格式,避免将其作为数字解析 [^3]。 ### 3.3 查询结果包含非预期字段或实体 在使用 Hibernate 的 `createAlias` 进行多表查询时,若未设置结果转换器,可能返回多个实体对象,导致字段映射错误并抛出 `NumberFormatException`。例如,当查询结果中包含两个实体对象,而期望只返回一个实体时,将出现类型转换异常 [^5]。 **解决方案:** - 设置结果转换器为 `ROOT_ENTITY`,确保只返回主实体对象。 ```java criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); ``` 此配置可避免因返回多个实体对象而导致的字段类型不匹配问题 [^5]。 ### 3.4 前端传参错误导致类型转换失败 当从前端传入的参数中包含非数字字符串(如 `"userName"`)而尝试将其转换为数值类型时,将触发 `NumberFormatException`。例如在 JSP 页面中解析 JSON 数据时,若字段值为用户名而非数字,将导致异常 [^4]。 **解决方案:** - 在转换前进行类型校验,确保字符串为合法数字格式。 ```java try { int id = Integer.parseInt(request.getParameter("id")); } catch (NumberFormatException e) { // 处理非法输入 } ``` 通过捕获异常并进行处理,可防止因非法输入导致的程序中断 。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值