今天遇到一个特郁闷的事儿,我在整一个项目的时候,需要用 Hibernate 查个东西,就那个数据库里的数据条数,我寻思这还不简单?直接上不就完事!
结果,啪一下,报错,很快!我一看,这不对劲,仔细瞅瞅错误信息,原来是类型转换出问题。我这想当然的以为uniqueResult()
返回的是个整数,直接就给强转成 Integer ,结果人家返回的根本不是那么回事儿!
实践过程
我是这么写的:
//错误写法
Integer count = (Integer) *();
我当时还挺自信,觉得这代码肯定没毛病,结果运行起来直接给我报个类型转换异常,我当时就懵。
后来我去网上查查资料,好家伙,原来uniqueResult()
这玩意儿,返回的结果类型还挺多变的。
- 如果是用 SQLQuery 查询,它返回的可能是个 BigDecial 类型的数字。
- 如果是普通的 Query 查询,那返回的类型就得看你具体查的是啥。
我这才反应过来,我这直接强转成 Integer,能不出错吗?
解决方法
找到问题,解决起来就简单多,我把代码改改:

//正确写法
Long count = ((Number) *()).longValue();
这回我学聪明,先把uniqueResult()
返回的结果转成 Number 类型,然后再调用它的longValue()
方法,转成 long 类型,这下总算没问题!
或者更稳妥一些,可以先判断一下是否为空:
Object result = *();
Long count = 0L;
if (result != null) {
count = ((Number) result).longValue();

这么一改,程序跑起来顺畅多,再也不报那个类型转换的错误。我也算是吃一堑长一智,以后再用uniqueResult()
的时候,可得小心着点,不能再想当然的直接强转。
这事儿也给我提个醒,写代码这事儿,还是得多细心,多看看文档,不能光凭经验想不然容易出各种奇奇怪怪的问题。