问题:
背景:
averageFare
字段并用结果 getAverageFare() 填充它我尝试过@Field注释
@Field("averageFare")
public BigDecimal getAverageFare() {
return fareTotal.divide(BigDecimal.valueOf(getCount()), RoundingMode.HALF_EVEN);
}
提前致谢!
你应该存储数据,而不是方法。您可以在上面的层中运行该计算。实体类应该是 POJO,注释
@Field("averageFare")
可以添加在字段本身而不是方法上。您可以将显示的方法作为实用方法,它总是会为您提供平均值on the fly
,而不是将其存储在数据库中。如果您需要存储它,只需添加 averageFare
实例类型 field 并在 setter 中执行该计算 - 然后您就不再需要 getter 计算了。
将计算逻辑从 getter 移至 setter。它确保该字段具有预期的价值,并且存储库使用计算的数据进行操作。
@Field("averageFare")
String averageFare;
public void setAverageFare(BigDecimal averageFare) {
if (averageFare == null || this.averageFare == null || this.fareTotal == null) {
// set if the calculation would fail on NPE
this.averageFare = averageFare;
} else {
// otherwise perform the calculation
this.averageFare = this.fareTotal.divide(
BigDecimal.valueOf(getCount()),
RoundingMode.HALF_EVEN);
}
}
public BigDecimal getAverageFare() {
return averageFare;
}
你可以这样做:
private BigDecimal averageFare;
public void calculateAverageFare() {
this.averageFare = this.fareTotal.divide(BigDecimal.valueOf(getCount()), RoundingMode.HALF_EVEN);
}
package your.package;
import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
import org.springframework.stereotype.Component;
@Component
public class YourEntityListener extends AbstractMongoEventListener {
@Override
public void onBeforeConvert(BeforeConvertEvent event) {
super.onBeforeConvert(event);
YourEntity entity = event.getSource();
entity.calculateAverageFare();
}
}
因此,每次更新文档时,计算字段都会自动保存在数据库中。