hibernate 返回 BigDecimal 数据类型而不是 long
hibernate 命名查询为数据类型为 NUMBER 的列返回 BigDecimal。
select col1 as "col1" from table1 union select col2 as "col1" from table2
在客户端,我希望 col1 的数据类型很长(原始) 我这样做:
<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
我该如何解决这个问题?我怀疑,别名有问题吗?
The hibernate named query returns a BigDecimal for a column that has datatype NUMBER.
select col1 as "col1" from table1 union select col2 as "col1" from table2
On client side, I expect the datatype of col1 to be long (primitive)
I do this:
<return-scalar column="col1" type="java.lang.Long" />
or
<return-scalar column="col1" type="long" />
In both cases, I get :
java.lang.ClassCastException: java.math.BigDecimal incompatible with java.lang.Long
How can I fix this? My suspiscion, something wrong with the aliasing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
默认情况下,Oracle NUMBER 映射到 Hibernate 中的 BigDecimal。尝试将类型设置为 BigDecimal。
Oracle NUMBER maps to BigDecimal in Hibernate by default. Try setting the type to BigDecimal.
我不知道你的 hibernate 配置有什么问题,但作为一种解决方法,有一个技巧可以让你不必关心 Hibernate 查询返回的 java
Number
类型,即将返回的值转换为Number
并调用.longValue()
:这样您就不必关心查询是否返回
Long
、BigDecimal
、< code>BigInteger、Short
只要它适合 javalong
即可。I don't know what the issue is with your hibernate configuration but as a workaround, one trick that allows you not to care what java
Number
type a Hibernate query returns is to cast the returned value toNumber
and call.longValue()
:That way you don't care if the query returns
Long
,BigDecimal
,BigInteger
,Short
as long as it fits into a javalong
.是的,Hibernate 将 Oracle Number 类型映射到 Java 中的 BigDecimal。
由于 Java 中的 BigDecimal 计算成本很高,因此一旦您在 Java 中获得 BigDecimal,请编写一个实用程序,根据您的数据大小将 BigDecimal 集合转换为 Integer 或 Long 集合。
Yes, Hibernate Maps Oracle Number Type to BigDecimal in Java.
Since BigDecimal computations are costly in Java, once You get the BigDecimal in Java, write a Utility to convert the BigDecimal Collection to Integer or Long collection, based on Your data size.
我也有同样的问题。这巧妙地解决了问题并返回长引用列表
: https://matthewbusche.com/2016/06/08/hibernate-returning-bigdecimal-instead-of-long/
I had the same problem. This fixes the issue neatly and returns a List of Long
ref: https://matthewbusche.com/2016/06/08/hibernate-returning-bigdecimal-instead-of-long/
由于 Jpa/Hibernate 默认将 Number 数据类型映射到 BigDecimal,因此您无法更改此行为。
您可以在您拥有的服务方法中处理转换。
根据业务案例需要,使用 bigDecimal.intValue() 或 bigDecimal.intValueExact() 或 bigDecimal.longValue() 将 BigDecimal 转换为 int/long
Since Jpa/Hibernate by default maps the Number datatype to BigDecimal, you can not change this behavior.
You can handle the conversion in the service methods you have.
Convert BigDecimal to int/long based on what the business case needs using
bigDecimal.intValue() or bigDeciml.intValueExact() or bigDecimal.longValue()