Я работаю над созданием кода для конвертации валюты.
У меня есть следующий интерфейс хранилища:
@Repository
public interface FxRateRepository extends JpaRepository<FxRate,Long> {
List<FxRate> findByCurrencyCode(String currencyTo, String currencyFrom);
И следующие записи в БД:
![enter image description here](https://i.stack.imgur.com/sfz6f.png)
Сценарий состоит в том, что есть входящий пакет денег в евро, и я хочу сохранить его на банковском счете в долларах США. Для этого мне нужно конвертировать на основе текущих курсов.
У меня есть следующий фрагмент кода:
private BigDecimal getAmount(AccountData accountData, Input input) {
String currencyOfAccount = accountData.getCurrency();
String amountCurrency = input.getCurrency();
List<FxRate> res = fxRateRepository.findByCurrencyCode(currencyOfAccount, amountCurrency);
if (Objects.nonNull(res)) {
for (FxRate fxRate : res) {
if (amountCurrency.equals(currencyOfAccount)) {
return inputAmount;
} else if (currencyOfAccount.equals("HUF")) {
BigDecimal midPrice = getMidPriceBasedOnAmountCurrency(input, fxRate);
if (Objects.nonNull(midPrice)) {
return inputAmount.multiply(midPrice)
.setScale(5, BigDecimal.ROUND_UP);
}
} else if (!currencyOfAccount.equals("HUF")) {
BigDecimal midPriceBasedOnCurrencyOfAccount = getMidPriceBasedOnCurrencyOfAccount(accountData, fxRate);
if (Objects.nonNull(midPriceBasedOnAmountCurrency) && Objects.nonNull(midPriceBasedOnCurrencyOfAccount)) {
return inputAmount.multiply(midPrice).divide(midPriceBasedOnCurrencyOfAccount)
.setScale(5, BigDecimal.ROUND_UP);
}
}
}
}
return null;
}
И следующий метод для получения midPrice, и это тот, который постоянно возвращает нулевое значение:
private BigDecimal getMidPriceBasedOnAmountCurrency(Input input, FxRate fxRate) {
if (fxRate.getCurrencyCode().equals(input.getCurrency())) {
return fxRate.getMidPrice();
} else if (input.getCurrency().equals(fxRate.getFixingCurrencyCode())) {
return new BigDecimal("0");
} else if (!input.getCurrency().equals(fxRate.getCurrencyCode()) && !input.getCurrency().equals(fxRate.getFixingCurrencyCode())){
BigDecimal midPrice = fxRateRepository.findMidPrice(input.getCurrency());
return midPrice;
}
return null;
}
Который основан на ....:
@Query("SELECT fx.midPrice FROM FxRate fx WHERE fx.currencyCode =:currencyTo")
BigDecimal findMidPrice(@Param("currencyTo") String currencyTo);
Этот запрос постоянно дает мне ноль, хотя валюта успешно заменена на евро, но запись в БД не найдена ...
Я тоже пробовал с поиском по списку:
List<FxRate> findMidPrice(String currencyTo);
... а затем получите поле с:
List<FxRate> midPriceList = fxRateRepository.findMidPrice(amountCurrency);
BigDecimal midPrice = midPriceList.get(0).getMidPrice();
Даёт также ноль ...
Я не могу понять, почему он не возвращает правильное значение, хотя он работал с findByCurrencyCode, как талисман ....
Есть идеи?
UPDATE
Если я помещаю второй запрос в отдельный новый класс / репозиторий, то он работает ...