Как обратиться к данным, полученным из таблицы, и произвести операции с ними?
Как обратиться к данным, полученным из таблицы, и произвести операции с ними?
Задача:
Существует таблица balance, которая содержит данные (см. ниже), в частности, поле sum (сумма).
Задача метода:
- получаем данные из таблицы
Balance - получаем конкретные поля, в частности, поле
sum - производим операцию с полем
sumметодомcalcBalance(см. далее пример) - перезаписываем данные
balanceRepo.save(balance)
Таблица Balance
package com.example.rabbit_new2.entity;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "balance_calc")
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Balance {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Column(name = "name")
private String name;
@NotNull
@Column(name = "sum")
private Double sum;
@Column(name = "tax")
private Double tax;
@Column(name = "result")
private Double result;
@Column(insertable = true, updatable = false)
private LocalDateTime dateCreated;
private LocalDateTime dateModified;
@PrePersist
void onCreate() {
this.setDateCreated(LocalDateTime.now());
this.setDateModified(LocalDateTime.now());
}
@PreUpdate
void onUpdate() {
this.setDateModified(LocalDateTime.now());
}
Незавершенная логика
public double calcBalance(double sum) {
double tax = 0.20;
double resultCalc = sum * tax;
return resultCalc;
}
public Iterable<Balance> getAllData() {
return balanceRepo.findAll();
}
public void calcMethodBalance() {
// получаем данные из таблицы Balance
// получаем конкретные поля в частности поле sum
// производим операцию с полем методом calcBalance
// перезаписываем данные balanceRepo.save(balance)
}
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
Возможно предполагается такое решение, в котором можно использовать метод интерфейса ListCrudRepository saveAll(Iterable<T> entities) или, при необходимости немедленного сохранения всей коллекции, JpaRepository::saveAllAndFlush
public void calcMethodBalance() {
// получаем данные из таблицы Balance
List<Balance> balances = balanceRepo.findAll();
// получаем конкретные поля в частности поле sum
// производим операцию с полем методом calcBalance
balances.forEach(b -> b.setSum(calcBalance(b.getSum())));
// перезаписываем данные
balanceRepo.saveAll(balances);
}
Альтернативное решение-"однострочник":
public void updateBalances() {
balanceRepo.findAll().forEach(b -> {
b.setSum(calcBalance(b.getSum()));
balanceRepo.save(b);
});
}
Однако стоит отметить, что использовать тип с плавающей точкой double для финансовых вычислений -- не самая лучшая идея из-за ошибок округления, см. ссылки: