groovy BigDecimal以字符串形式存储在Spring数据MongoDB中

yrefmtwq  于 2022-11-21  发布在  Spring
关注(0)|答案(2)|浏览(329)
@Document(collection = "loanDetails")
class LoanDetails {
    @Transient
    public static final String COLLECTION_NAME = "loanDetails
    @Id
    String id

    String loanId
    String loanUUID
    String loanStatus
    Date loanDateCreated
    Date loanLastUpdated
    BigDecimal loanAmount //Stores in String
}

我声明了一个类LoanDetails和一个包含BigDecimal类型loanAmount的字段每当我在这个集合中保存一些数据时
1.它以字符串的形式存储在mongo db数据库中
1.从数据库中获取记录时,出现错误无法解码'LoandDetails'。解码'loanAmount'时出错:只有在CurrentBSONType为DECIMAL128时才能调用readDecimal,而在CurrentBSONType为STRING时不能调用。
我试图在loanAmount字段上添加注解

@Field(targetType = Decimal128) // This also throws error does not contain targetType attribute attached screenshot for the same
BigDecimal loanAmount

new9mtju

new9mtju1#

您 可能 需要 删除/迁移 已经 创建 的 loanDetails , 因为 loanAmount 字段 被 持久 化 为 String
通过 将 @Field(targetType = FieldType.DECIMAL128) 添加 到 您 的 loanAmount 字段 , 它 应该 可以 工作 。

import org.springframework.data.mongodb.core.mapping.FieldType;
...

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

public LoanDetails() {
    loanAmount = new BigDecimal(21.905334472656250);
}
...
 
template.save(loan);

template.find(new Query(), org.bson.Document.class, "loanDetails").forEach(l -> {
    System.out.println(l.get("loanAmount").getClass().getName() + " " + l.get("loanAmount"));   
});
//org.bson.types.Decimal128 21.90533447265625
    
template.findAll(LoanDetails.class).forEach(l -> {
    System.out.println(l.loanAmount.getClass().getName() + " " + l.loanAmount); 
});
//java.math.BigDecimal 21.90533447265625

中 的 每 一 个
如果 你 得到 Conversion to Decimal128 would require inexact rounding of XXX
注意 : Decimal128 类型 最 多 只 支持 34 位 精度 。 ( 通常 , " precision " = 总 位 数 , 而 " scale " = 小数 位 数 ) 。 而 Java BigDecimal 可以 更 高 。 因此 , 在 保存 到 DB 之前 , 您 需要 舍入 BigDecimal 值 ( 例如 , 使用 BigDecimal.setScale() ) 方法 。
BigDecimalConverter issue 的 最 大 值|十进制 128

eivgtgni

eivgtgni2#

您可以在mongo config中注册自定义转换

@Configuration        
public class MongoConfig
{

    @Bean
    public CustomConversions customConversions()
    {
        return new MongoCustomConversions(Arrays.asList(
                new BigDecimalToDocumentWritingConverter()
            ));
    }
}

在那里进行转换

public class BigDecimalToDocumentWritingConverter implements Converter<BigDecimal, String> {

    @Override
    public String convert(@Nullable BigDecimal amount) {
        if (amount == null) return null;
        return String.valueOf(amount.doubleValue());
    }
}

相关问题