我如何遍历数据库中已有的对象并更新字段?
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 它们。
总之问题解决了:)
我正在构建一个 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 它们。
总之问题解决了:)