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
我该如何解决这个问题?我怀疑,别名错了吗?
答案 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();
,Long
,BigDecimal
,BigInteger
,只要它适合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()
答案 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/