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();

猜你喜欢

转载自blog.csdn.net/crazestone0614/article/details/127706463