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

时间:2011-03-21 15:54:02

标签: hibernate long-integer bigdecimal

hibernate命名查询返回数据类型为NUMBER的列的BigDecimal。

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

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

<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

我该如何解决这个问题?我怀疑,别名错了吗?

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

我不知道您的休眠配置有什么问题,但是作为一种变通办法,一种使您不必关心休眠查询返回的Java Number类型的技巧是将返回值转换为{{ 1}},然后致电Number

.longValue()

这样,您就不必担心查询是否返回long id = ((Number) em.createNativeQuery("select my_seq.nextVal from dual") .getSingleResult()) .longValue(); LongBigDecimalBigInteger,只要它适合Java Short

答案 2 :(得分:1)

是的,Hibernate将Oracle数字类型映射到Java中的BigDecimal。 由于BigDecimal计算在Java中很昂贵,因此一旦在Java中获得BigDecimal,就可以编写一个实用程序,根据您的数据大小将BigDecimal集合转换为Integer或Long集合。

答案 3 :(得分:0)

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

您可以使用自己的服务方法处理转换。 根据业务案例需要使用bigDecimal.intValue() or bigDeciml.intValueExact() or bigDecimal.longValue()

将BigDecimal转换为int / long

答案 4 :(得分:0)

我有同样的问题。这样可以很好地解决问题,并返回Long列表

List<Long> orgTypeIds = session.createSQLQuery("SELECT typeId FROM org_type_cd")
                               .addScalar("typeId", StandardBasicTypes.LONG)
                               .list();

ref:https://matthewbusche.com/2016/06/08/hibernate-returning-bigdecimal-instead-of-long/