Вот несколько вариантов:
1) Создайте запрос jpql, который напрямую делает то, что вам нужно:
select d from Debt d where (d.totalAmount - d.amountPaid) = 0
Преимущества подхода в том, что он прост и будетвсегда работать.Недостатком является то, что ваш запрос должен понимать, как рассчитывается платная логика.
2) Создайте постоянное платное значение, в котором хранится вычисленное значение:
@Basic
private boolean paid;
public boolean isPaid() {
return this.paid;
}
private void updateCalculations() {
this.paid = (this.totalAmount - this.amountPaid == 0);
}
// using int as example here
public void setTotalAmount(int totalAmount) {
this.totalAmount = totalAmount;
updateCalculations();
}
public void setAmountPaid(int amountPaid) {
this.amountPaid = amountPaid;
updateCalculations();
}
Преимущество этого подхода заключается в том, чточто вы сможете создать запрос jpql, который непосредственно проверяет логическое значение, т. е.
select d from Debt d where d.paid = true;
Очевидно, недостатком этого подхода является то, что вам нужно обязательно пересчитывать значение при каждом обновлении.ценности.Тем не менее, это может быть облегчено, если вы рассчитываете только при доступе.Это означает, что в вашем методе isPaid () вы вычисляете значение, присваиваете его платному атрибуту, а затем возвращаете значение.Если вы решите использовать этот подход, вам потребуется добавить методы @PrePersist и @PreUpdate, которые выполняют расчет с оплатой и обновляют атрибут с оплатой до сохранения компонента в хранилище данных (гарантирует, что оплачиваемое значение всегда покрывается.
Если вы используете аннотации JPA для самих своих атрибутов, вы можете иметь метод получения без установщика и при этом иметь возможность корректно получать и сохранять значения в базе данных.