如何获取 Spring 数据以将“getter”保存为 mongodb 字段?

问题描述 投票:0回答:3

问题:

  • 如何获取 Spring 数据以将“getter”保存为 mongodb 字段?

背景:

  • Score java 对象有一个执行计算的“getAverageFare()”方法
  • 另一个对象(即实现@Document)将 Score 作为字段
  • 目标:弹簧数据,当它保存父文档时添加一个
    averageFare
    字段并用结果 getAverageFare() 填充它

我尝试过@Field注释

@Field("averageFare")
public BigDecimal getAverageFare() {
    return fareTotal.divide(BigDecimal.valueOf(getCount()), RoundingMode.HALF_EVEN);
}

提前致谢!

java spring mongodb spring-data-mongodb
3个回答
1
投票

你应该存储数据,而不是方法。您可以在上面的层中运行该计算。实体类应该是 POJO,注释

@Field("averageFare")
可以添加在字段本身而不是方法上。您可以将显示的方法作为实用方法,它总是会为您提供平均值
on the fly
,而不是将其存储在数据库中。如果您需要存储它,只需添加
averageFare
实例类型 field 并在 setter 中执行该计算 - 然后您就不再需要 getter 计算了。


1
投票

将计算逻辑从 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;
}

0
投票

你可以这样做:

  1. 在 POJO 中定义字段“averageFare”(与任何其他成员一样)

private BigDecimal averageFare;
  1. 创建计算其值的方法

public void calculateAverageFare() {
  this.averageFare = this.fareTotal.divide(BigDecimal.valueOf(getCount()), RoundingMode.HALF_EVEN);
}
  1. 创建自定义 Mongo 事件监听器

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();
  }
}

因此,每次更新文档时,计算字段都会自动保存在数据库中。

© www.soinside.com 2019 - 2024. All rights reserved.