当我想从具有BigDecimal字段的mongo获取对象时,我遇到了问题。
我在mongo中有下一个结构:
{
"_id":ObjectId("546b07420c74bf96c7c3cd5f"),
"accountId":"1",
"modelVersion":"seasonal_optimized",
"yearMonth":"20143",
"income":{
"unscaled":{
"$numberLong":"68500"
},
"scale":2
},
"expense":{
"unscaled":{
"$numberLong":"125900"
},
"scale":2
}
}
实体是:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "forecasts")
public class Forecast {
private String accountId;
private LocalDate monthYear;
private String modelVersion;
private BigDecimal income;
private BigDecimal expense;
}
我正在尝试从mongo中检索一个对象,但是我收到了下一个错误:
org.springframework.data.mapping.model.MappingInstantiationException:无法使用带参数的构造函数NO_CONSTRUCTOR实例化java.math.BigDecimal。
任何人都可以帮助我吗?
谢谢!!!!
答案 0 :(得分:0)
这是一个老问题,但我使用Spring数据mongo和聚合框架时遇到了同样的问题。 特别是当我想要一个BigDecimal作为返回类型时。
一种可行的解决方法是将BigDecimal
包装在一个类中,并将其作为返回OutPutType
提供,即:
@Data
public class AverageTemperature {
private BigDecimal averageTemperature;
}
@Override
public AverageTemperature averageTemperatureByDeviceIdAndDateRange(String deviceId, Date from, Date to) {
final Aggregation aggregation = newAggregation(
match(
Criteria.where("deviceId")
.is(deviceId)
.andOperator(
Criteria.where("time").gte(from),
Criteria.where("time").lte(to)
)
),
group("deviceId")
.avg("temperature").as("averageTemperature"),
project("averageTemperature")
);
AggregationResults<AverageTemperature> result = mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(YourDocumentClass.class), AverageTemperature.class);
List<AverageTemperature> mappedResults = result.getMappedResults();
return (mappedResults != null ? mappedResults.get(0) : null);
}
在上面的示例中,聚合将平均温度计算为BigDecimal。
请注意,默认BigDecimal
转换器会在保存时将其映射到mongodb中的字符串。 mapping-conversion
使用Spring数据mongo,我使用的版本不再是一个问题,检索文档应该是一个问题:
org.springframework.boot:spring-boot-starter-data-mongodb:jar:2.0.1.RELEASE
spring-data-mongodb:jar:2.0.6.RELEASE
org.mongodb:mongodb-driver:jar:3.6.3