Spring Data MongoDB BigDecimal支持

时间:2016-06-21 16:52:46

标签: mongodb spring-data-mongodb

我怀疑与Spring Data MongoDB的BigDecimal值支持有关,有人可以帮我提供一些有关它的新闻,是否会支持这种类型,或者是否有人知道解决方法来满足我的需求。这就是交易:我正在开发一个项目,我们使用MongoDB作为DB和Spring作为框架,我们想保存我们应该在数据库中获取货币值的字段作为BigDecimal,我读过那个mongo只接受double作为浮点数,但我不认为这种类型会有用。你能问我一些关于它的事吗?

4 个答案:

答案 0 :(得分:7)

您可以更改//css .app p { color: green; } //JS import styles from './app.css'; <div className={styles.app}> <p>{ this.state.count }</p> <button onClick={() => this.increment()}>Increment</button> </div> 执行BigDecimal的转换器,这是NumberDecimal的java表示形式,因为mongo 3.4:

Decimal128

实际上自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();
            }

        }


    ));

}

答案 1 :(得分:6)

Spring Data MongoDB在写入时将BigDecimal值转换为String,并在读取时将其转换回NSArray *arr = //response; for (NSDictionary *dic in arr) { if([dic objectForKey:"statutory_month"]) //add if([dic objectForKey:"statutory_date"]) //add } 。请查看参考手册的data mapping and type conversion部分。

答案 2 :(得分:1)

如Spring Data MongoDB所记录-参考文档18.6. Custom Conversions - Overriding Default Mapping

影响映射结果的最简单的方法是通过@Field注释指定所需的本机MongoDB目标类型。这样可以在域模型中使用非MongoDB类型(如BigDecimal),同时以本机org.bson.types.Decimal128格式保存值。

public class Payment {

  @Field(targetType = FieldType.DECIMAL128) 
  BigDecimal value;

}

所需目标类型明确定义为Decimal128,它转换为NumberDecimal。否则,BigDecimal的值将变成String

{
  "value" : NumberDecimal(2.099)
}

答案 3 :(得分:0)

我遇到一个极端的情况,其中我有很多小数,Decimal128的构造函数提出了以下异常:

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))