hibernate returning BigInteger instead of Long(hibernate返回java类型为BigInteger)

场景: mysql数据库定义数据类型为bigInt, hibernate映射文件中定义类型为Long,通过hibernate查询出来的确实java.math.BigInteger

[code="java"]
private Long id;
private Long projectId;
private Long orgRoleId;
[/code]

[code="java"]









[/code]

数据库定义类型为bigInt, Mysql数据库

查询:
[code="java"]
List> list = this.hibernateTemplate
.execute(new HibernateCallback>>() {

                public List<Map<String, Object>> doInHibernate(
                        Session session) throws HibernateException,
                        SQLException {
                    List find = null;
                    String sql = "select t1.* ,t2.portalItemId as itemId ,t2._column ,t2._row ,t2._order ,t2.orgRoleId ,t2.projectId, t2.workZoneSiteId ,t2.portalItemHeight,t2.portalItemWidth from portal_item as t1,portal_default_workzonesite_item as t2 where t1.status=1 and t1.id=t2.portalItemId and t2.workZoneSiteId='"
                            + workZoneSiteId + "'";

                    SQLQuery query = session.createSQLQuery(sql);
                    query
                            .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
                    find = query.list();
                    return find;
                }
            });

[/code]

在得到的list拿出相应原本以为Long类型数据进行Long型转换时抛出Exception:

ClassCastException: cannot cast java.math.BigInteger to java.lang.Long

请问有人遇到过这情况吗,请问发生这种不预期的异常原因在哪?谢谢

4个回答

你的配置和使用都没问题。
1、用的是hibernate哪个版本?
2、把异常和代码贴全 (workZoneSiteId 是什么类型?)

jinnianshilongnian
jinnianshilongnian 或者你改成HQL 而不是SQL
接近 8 年之前 回复
xiaoliang330
xiaoliang330 这个方法是可行,但需要每个column都指定一次,不然就只能拿到那列的数据,其他数据为null
接近 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 嗯, 你这个是SQL 不是 HQL 所有需要自己指定类型
接近 8 年之前 回复
xiaoliang330
xiaoliang330 明天试试看
接近 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 晕 你用的是SQLQuery 这个需要 .addScalar("ID", Hibernate.LONG) 来指定列类型
接近 8 年之前 回复
xiaoliang330
xiaoliang330 是的,数据库里面的类型和配置文件中的配置类型,pojo的类型都不存在问题
接近 8 年之前 回复
jinnianshilongnian
jinnianshilongnian portal_default_workzonesite_item as t2 这个表也映射为了 Long??
接近 8 年之前 回复
xiaoliang330
xiaoliang330 用的hibernate是3.3.1 代码请看问题补充
接近 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 嗯,我在本机测试没问题
接近 8 年之前 回复
xiaoliang330
xiaoliang330 == 现在还测不了,手头没代码,后天贴出来
接近 8 年之前 回复

应该是java.lang.long吧

xiaoliang330
xiaoliang330 应该不是这个影响的,主要来是mysql数据库设置bigInt类型,java应该返回Long型,却返回了java.math.BigInteger类型的了
接近 8 年之前 回复
henghanan
henghanan 这个我是看Hibernate文档里的,里面的pojo的属性类型是Long的话,对应的hbm.xml的是<id type="long">而我以前也只这样用过,不知道跟这个有没有关系呢?
接近 8 年之前 回复

:oops: 我好像错了,如果你用的是mysql的话,java.lang.Long改为java.math.BigDecimal试试

请看以下网址的Table 20.24
[url]http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-type-conversions.html[/url]

xiaoliang330
xiaoliang330 后天我会贴出异常详细信息,谢谢关注
接近 8 年之前 回复
henghanan
henghanan 对,转成Long是没问题的,应该是代码的问题
接近 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 转成Long是没问题的,不知道哪种情况会发生无法转换
接近 8 年之前 回复
henghanan
henghanan 又找到一个链接:http://stackoverflow.com/questions/5553863/cast-bigint-to-long
接近 8 年之前 回复

BigInteger的分析其实涉及很多内容,网上都不怎么全面,找了半天,感觉这个系列的教程讲解的还是最详细的:http://swiftlet.net/archives/tag/java-biginteger

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐