大家好,我有一个关于Spring Data MongoDB支持BigDecimal值的疑问,谁能帮我提供一些相关的消息,是否会支持这种类型,或者是否有人知道一个变通的方法来满足我的需求。事情是这样的:我正在做一个项目,我们使用MongoDB作为数据库,Spring作为框架,我们想把我们应该在数据库中获取货币值的字段保存为BigDecimal,我读到Mongo只接受双数作为浮点数,但我不认为这种类型会有用。你们能不能给我一些启示?
春天数据MongoDB转换 BigDecimal
值到 String
上写,阅读时回。请看一下 数据映射和类型转换 参考手册的章节。
您可以更改 BigDecimal
做 Decimal128
的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();
}
}
我有一个角落的例子,我有很多小数,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))