es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

BigDecimal se almacena como una cadena de caracteres en MongoDB de Spring Data.

@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; //Se almacena como String

}

He declarado una clase LoanDetails y un campo de tipo BigDecimal llamado loanAmount en ella.
Cada vez que guardo datos en esta colección:

  1. Se almacena como una cadena de texto en la base de datos de mongo db.
  2. Cuando obtengo los registros de la base de datos, aparece el error:
    Error al decodificar ‘LoanDetails’. El error en la decodificación de ‘loanAmount’ es:
    readDecimal solo se puede llamar cuando CurrentBSONType es DECIMAL128,
    no cuando CurrentBSONType es STRING.

He intentado agregar una anotación sobre el campo loanAmount:

@Field(targetType = Decimal128) // Esto también produce un error, no contiene el atributo targetType. Adjunto una captura de pantalla del mismo
BigDecimal loanAmount

enter image description here

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para guardar el campo loanAmount de tipo BigDecimal en MongoDB como Decimal128, debes utilizar la anotación org.springframework.data.mongodb.core.mapping.Field con su atributo targetType configurado como Decimal128.

    Aquí tienes cómo puedes modificar el código para lograr esto:

    import org.springframework.data.mongodb.core.mapping.Document;
    import org.springframework.data.mongodb.core.mapping.Field;
    
    import java.math.BigDecimal;
    import java.util.Date;
    
    @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;
    
        @Field(targetType = FieldType.DECIMAL128)
        BigDecimal loanAmount;
    }
    

    De esta manera, cuando guardes una instancia de LoanDetails que contenga un valor de loanAmount, se almacenará en MongoDB como Decimal128 en lugar de como cadena. Y al recuperar los registros de la base de datos, ya no deberías obtener el error de decodificación.

Comments are closed.