Как обратиться к данным, полученным из таблицы, и произвести операции с ними?

Как обратиться к данным, полученным из таблицы, и произвести операции с ними?

Задача:

Существует таблица 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 для финансовых вычислений -- не самая лучшая идея из-за ошибок округления, см. ссылки:

→ Ссылка