Hibernate返回BigDecimal数据类型而不是long类型

11

使用Hibernate命名查询为数据类型为NUMBER的列返回一个BigDecimal。

select col1 as "col1" from table1 union select col2 as "col1" from table2

在客户端,我希望col1的数据类型是long(原始类型),我这样做:

<return-scalar column="col1" type="java.lang.Long" />
或者
<return-scalar column="col1" type="long" />
在这两种情况下,我都得到了:
java.lang.ClassCastException: java.math.BigDecimal incompatible with java.lang.Long

我该怎么解决这个问题?我怀疑是别名出了问题?


你在使用Oracle吗?Oracle的NUMBER类型映射到BigDecimal。 - Robby Pond
1
是的。Oracle 10g。如何转换为长整型? - Victor
5个回答

14

默认情况下,Oracle NUMBER 在 Hibernate 中映射为 BigDecimal 类型。尝试将类型设置为 BigDecimal。


也许我的问题没有表述清楚。也许你没有读懂它。<return-scalar column="col1" type="java.lang.Long" /> 的目的是覆盖 Hibernate 中默认的 BigDecimal。 - Victor
1
@Victor 如果你需要通过Hibernate真正返回一个Long对象,那么你应该将数据库数据类型更改为LONG - Amir Azizkhani

11

我不知道你的Hibernate配置出了什么问题,但是作为一种解决方法,让你不用担心Hibernate查询返回的Java Number类型是什么,可以将返回值强制转换成Number类型并调用.longValue()来实现:

我不知道你的Hibernate配置出了什么问题,但是作为一种解决方法,让你不用担心Hibernate查询返回的Java Number类型是什么,可以将返回值强制转换成Number类型并调用.longValue()来实现:

long id = ((Number) em.createNativeQuery("select my_seq.nextVal from dual")
              .getSingleResult())
          .longValue();

这样,只要查询结果适合用java long类型表示,你就不需要关心它返回的是LongBigDecimalBigInteger还是Short


1

是的,Hibernate在Java中将Oracle Number类型映射为BigDecimal。 由于Java中BigDecimal计算成本高昂,一旦您在Java中获得了BigDecimal,请编写一个实用程序将BigDecimal集合转换为整数或长整数集合,根据您的数据大小。


1

0

由于Jpa/Hibernate默认将Number数据类型映射为BigDecimal,因此您无法更改此行为。

您可以在服务方法中处理转换。根据业务需求使用bigDecimal.intValue()或bigDeciml.intValueExact()或bigDecimal.longValue()将BigDecimal转换为int/long。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接