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

发布于 2024-10-24 17:55:56 字数 526 浏览 1 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

錯遇了你 2024-10-31 17:55:56

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

Oracle NUMBER maps to BigDecimal in Hibernate by default. Try setting the type to BigDecimal.

南城追梦 2024-10-31 17:55:56

我不知道你的 hibernate 配置有什么问题,但作为一种解决方法,有一个技巧可以让你不必关心 Hibernate 查询返回的 java Number 类型,即将返回的值转换为 Number 并调用 .longValue()

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

这样您就不必关心查询是否返回 LongBigDecimal、< code>BigInteger、Short 只要它适合 java long 即可。

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 to Number and call .longValue():

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

That way you don't care if the query returns Long, BigDecimal, BigInteger, Short as long as it fits into a java long.

老旧海报 2024-10-31 17:55:56

是的,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.

╰つ倒转 2024-10-31 17:55:56

我也有同样的问题。这巧妙地解决了问题并返回长引用列表

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

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

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/

私藏温柔 2024-10-31 17:55:56

由于 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()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文