Hibernate createSQLQuery异常:java.lang.Integer cannot be cast to java.math.BigInteger

一、异常分析

开发环境:springboot (2.3.12.RELEASE) + hiberate(5.4.32.Final)

笔者注册新用户时候,通过函数max(id)获取用户表最大的ID键值,执行SQL语句抛出异常:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.math.BigInteger

	public long mGetMaxId() {
		
		Session session = sessionFactory.getCurrentSession();
		//这么写会抛出异常:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.math.BigInteger
		BigInteger result = (BigInteger) session.createSQLQuery("select max(id) from " + Constants.TABLE_USER).uniqueResult();
		if(result == null){
			return 0;
		}
		return result.longValue();
		
	}

修正后的正确写法:

	public long mGetMaxId() {
		
		Session session = sessionFactory.getCurrentSession();
		Object result = session.createSQLQuery("select max(id) from " + Constants.TABLE_USER).uniqueResult();
		if(result == null){
			return 0;
		}
		return Long.valueOf(result.toString());
	}

原因分析:

Object result = session.createSQLQuery("select max(id) from " + Constants.TABLE_USER).uniqueResult();
boolean isInterger  = (result instanceof Integer)

这里测试下,获取到的isInterger的值为true, 说明查询语句返回的是Integer类型,强制转换为BigInteger类型就会报错。这里为什么会返回Interger类型,笔者估计是因为max(id)函数的id字段是Integer类型,所以返回的是Integer类型。

二、其它情况分析:

(BigInteger) session.createSQLQuery("select count(*) from tb_user").uniqueResult();

这里经过笔者测试,上面的count(*)的sql查询结果返回的类型是BigInteger类型,所以这里转型为BigInteger就不会抛出异常了。

三、总结

所以,Hibernate的查询语句是非类型安全的,这意味着您必须将结果转换为相应的类型,如果无法完成转换,则可能导致运行时异常。为了避免报错类型转换错误,可以先转型为父类Number类型再获取到其int value值就不会报错了。

((Number) getSession().createSQLQuery(sql).uniqueResult()).intValue();

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思涛的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值