我如何遍历数据库中已有的对象并更新字段?

How can i iterate over objects that already inside a database and update a field?

我正在构建一个 RESTful API,它将显示我所有的 assets/investments。 我想在每个资产中显示该资产占投资组合总价值的百分比。我希望 totalValue 是动态的,因此每创建一个新资产,它就会将 (realTimePrice * amount) 添加到 totalValue。

我的问题是:完成填充数据库并计算总值后,我如何对数据库中的每个对象 运行 和 运行 setPercentage()?

例如:

“名称”:比特币 “代码”:BTC-USD “百分比”:20

这就是我为数据库播种的方式:

package assets.asset;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration

class SeedDB {

@Bean
CommandLineRunner initDatabase(DataBase repository) {
    return args -> {

        repository.save(new Asset("", "",, , "Crypto"));
        repository.save(new Asset("", "",, , "Crypto"));
        repository.save(new Asset("", "",, , "Crypto"));
        repository.save(new Asset("", "",, , "Stock"));
        repository.save(new Asset("", "",, , "Stock"));
        repository.save(new Asset("", "",, , "Stock"));
        
    };
}

}

这根本不是可扩展的设计。一次计算要重复多次。想象一下,您有一个 table 的 100 万个这样的值,并且您需要为所有这些值填充投资组合百分比,您实际上将重新计算总资产价值一百万次。当添加新字段时,可以缓存和更新此值。

在我看来,资产价值相对于投资组合的百分比甚至不应该存储在数据库中。原因是,这个值需要经常更新。例如,每次我们添加一项资产时,我们都必须更新所有值的百分比。

这是一个应根据要求计算的值。

我们可以在名为 'Total Asset Value' 的数据库中存储一个特定的值。这将保存相关信息。 然后每次完成一个操作来添加一个新号码,我们可以有一个可以做的服务

public void setTotalValue() {
    TotalValue+=BigDecimal.valueOf(amount);
    repository.save(totalValue); // this line can be however you want to persist your data
}

我们的想法是每次添加新资产时都添加总价值,然后当我们想要计算总价值时,我们可以做类似的事情,

public Map<Asset, BigDecimal> getTotalPercentages(List<Asset> assets) {
    for (asset : asset) {
        map.put(asset, asset.value/totalValue);
    }
    return map;
}

这将动态地为您提供准确的数据,并节省插入数据库的额外时间。

编辑:在评论中给出一些上下文后,我有 re-did 另一个解决方案。

我们可以简单地拥有一个变量 totalValue,它会在您每次在播种阶段添加资产时增长,在播种结束时,您可以遍历所有资产并为每个资产设置百分比。

int totalValue = 0;
String[] types = new String[]{"Crypto", "Stock"};
for (int i = 0; i < NUM_OF_DESIRED_ASSETS; i++) {
    Random r = new Random();
    int value = r.nextInt(10);
    int index = r.nextInt(2);
    repository.save(new Asset("", "",value, , types[index]));   

    totalValue+=value; 
}

for (asset : assets) {
    asset.setPercentage(asset.value/totalValue);
    repository.save(asset);
}

'berlin'的回复帮了大忙。 一旦我完成填充数据库,我就将以下内容添加到 SeedDB class :

            for (Asset asset : repository.findAll())
            {
            asset.percentage = asset.setPercentage();
            repository.save(asset);
            }

我一直在尝试几种想法,包括尝试使用将触发 setPercentage() 的 @PutMapping,但不了解如何在所有资产上执行它并收集它们并 return 它们。

总之问题解决了:)