支持Spring Data MongoDB BigDecimal

问题描述 投票:6回答:3

大家好,我有一个关于Spring Data MongoDB支持BigDecimal值的疑问,谁能帮我提供一些相关的消息,是否会支持这种类型,或者是否有人知道一个变通的方法来满足我的需求。事情是这样的:我正在做一个项目,我们使用MongoDB作为数据库,Spring作为框架,我们想把我们应该在数据库中获取货币值的字段保存为BigDecimal,我读到Mongo只接受双数作为浮点数,但我不认为这种类型会有用。你们能不能给我一些启示?

mongodb spring-data-mongodb
3个回答
12
投票

春天数据MongoDB转换 BigDecimal 值到 String 上写,阅读时回。请看一下 数据映射和类型转换 参考手册的章节。


12
投票

您可以更改 BigDecimalDecimal128 的java表示。NumberDecimal 自从mongo 3.4.3.RELEASE之后,Spring Data 2.0.7.RELEASE上面的变化如下

@Bean
public MongoCustomConversions mongoCustomConversions() {
    return new MongoCustomConversions(Arrays.asList(

        new Converter<BigDecimal, Decimal128>() {

            @Override
            public Decimal128 convert(@NonNull BigDecimal source) {
                return new Decimal128(source);
            }
        },

        new Converter<Decimal128, BigDecimal>() {

            @Override
            public BigDecimal convert(@NonNull Decimal128 source) {
                return source.bigDecimalValue();
            }

        }


    ));

}

其实从Spring Data 2.0.7.RELEASE开始,上面的内容就变成了下面的内容。

@Bean
public MongoCustomConversions mongoCustomConversions() {
    return new MongoCustomConversions(Arrays.asList(
        new BigDecimalDecimal128Converter(),
        new Decimal128BigDecimalConverter()
    ));

}

@WritingConverter
private static class BigDecimalDecimal128Converter implements Converter<BigDecimal, Decimal128> {

    @Override
    public Decimal128 convert(@NonNull BigDecimal source) {
        return new Decimal128(source);
    }
}

@ReadingConverter
private static class Decimal128BigDecimalConverter implements Converter<Decimal128, BigDecimal> {

    @Override
    public BigDecimal convert(@NonNull Decimal128 source) {
        return source.bigDecimalValue();
    }

}

0
投票

我有一个角落的例子,我有很多小数,Decimal128`s构造函数引发了以下异常。

Failed to convert from type [java.math.BigDecimal] to type [org.bson.types.Decimal128] for value '21.6000000000000000888178419700125232338905334472656250'; nested exception is java.lang.NumberFormatException: Conversion to Decimal128 would require inexact rounding of 21.6000000000000000888178419700125232338905334472656250

解决方法是将输入的小数四舍五入。

new Decimal128(source.round(MathContext.DECIMAL128))
© www.soinside.com 2019 - 2024. All rights reserved.