Hibernate, возвращающий тип данных BigDecimal вместо long - PullRequest
7 голосов
/ 21 марта 2011

Именованный запрос Hibernate возвращает BigDecimal для столбца с типом данных NUMBER.

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

Как я могу это исправить? Мое подозрение, что-то не так с псевдонимами?

Ответы [ 4 ]

5 голосов
/ 21 марта 2011

Oracle NUMBER отображается в BigDecimal в Hibernate по умолчанию. Попробуйте установить тип BigDecimal.

4 голосов
/ 26 июня 2018

Я не знаю, в чем проблема с вашей конфигурацией hibernate, но в качестве обходного пути, один прием, который позволяет вам не заботиться о том, какой тип java Number возвращает запрос Hibernate, состоит в приведении возвращенного значения к Number иcall .longValue():

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

Таким образом, вам все равно, если запрос вернет Long, BigDecimal, BigInteger, Short, пока он вписывается в Java long.

1 голос
/ 11 января 2013

Да, Hibernate сопоставляет тип номера Oracle с BigDecimal в Java. Поскольку вычисления BigDecimal в Java являются дорогостоящими, после того, как вы получите BigDecimal в Java, напишите утилиту для преобразования коллекции BigDecimal в коллекцию Integer или Long в зависимости от размера ваших данных.

0 голосов
/ 04 апреля 2018

Поскольку Jpa / Hibernate по умолчанию отображает тип данных Number на BigDecimal, вы не можете изменить это поведение.

Вы можете справиться с конвертацией в тех методах обслуживания, которые у вас есть. Преобразуйте BigDecimal в int / long в зависимости от потребностей бизнес-кейса, используя bigDecimal.intValue() or bigDeciml.intValueExact() or bigDecimal.longValue()

...