Как сопоставить BigDecimal в Hibernate, чтобы вернуть тот же масштаб, который я ввел?

В Java new BigDecimal("1.0") != new BigDecimal("1.00") имеет значение масштаб.

Однако это, по-видимому, неверно для Hibernate/SQL Server. Если я установлю шкалу для BigDecimal на определенное значение, сохраню BigDecimal в базе данных через Hibernate, а затем повторно накачаю свой объект, я верну BigDecimal с другим масштабом.

Например, значение 1,00 возвращается как 1,000000, я полагаю, потому что мы сопоставляем BigDecimals со столбцом, определенным как NUMERIC(19,6). Я не могу просто определить столбец как требуемый масштаб, так как мне нужно хранить значения доллара и иены (например) в одном столбце. Нам нужно представить BigDecimals как числовые типы в базе данных для использования внешних инструментов отчетности.

Существует ли пользовательский тип Hibernate, который «правильно» отображает BigDecimal, или мне нужно написать свой собственный?


person Robert Atkins    schedule 01.07.2011    source источник


Ответы (3)


Просто для информации я могу сказать вам, что создание BigDecimal, возвращающегося из базы данных, выполняется реализацией проприетарным драйвером JDBC метода getBigDecimal подкласса ResultSet для конкретной базы данных.

Я обнаружил это, пройдя через исходный код Hibernate с помощью отладчика, пытаясь найти ответ на свой собственный вопрос.

person DuncanKinnear    schedule 07.02.2014

Я думаю, что это сработает, хотя я не проверял.

public class BigDecimalPOJO implements Serializable {

    private static final long serialVersionUID = 8172432157992700183L;

    private final int SCALE = 20;
    private final RoundingMode ROUNDING_MODE = RoundingMode.CEILING;
    private BigDecimal number;

    public BigDecimalPOJO() {

    }

    public BigDecimal getNumber() {
        return number.setScale(SCALE, ROUNDING_MODE);
    }

    public void setNumber(BigDecimal number) {
        this.number = number.setScale(SCALE, ROUNDING_MODE);
    }
}
person Tapas Bose    schedule 01.07.2011

Не уверен, но вы можете проверить равенство, используя a.compareTo(b) == 0.

person Distortum    schedule 01.07.2011
comment
Это на самом деле не помогает мне - мне нужно количество десятичных знаков, сохраненных для целей отображения. - person Robert Atkins; 05.07.2011
comment
Это совсем другая проблема. Вам нужен согласованный способ представления числа в виде строки. String.format(String, Object...) поможет вам решить эту проблему. - person Distortum; 05.07.2011