Запрос репозитория фреймворка Spring возвращает ноль - PullRequest
0 голосов
/ 31 октября 2018

Я работаю над созданием кода для конвертации валюты.

У меня есть следующий интерфейс хранилища:

@Repository
public interface FxRateRepository extends JpaRepository<FxRate,Long> {

    List<FxRate> findByCurrencyCode(String currencyTo, String currencyFrom); 

И следующие записи в БД:

enter image description here

Сценарий состоит в том, что есть входящий пакет денег в евро, и я хочу сохранить его на банковском счете в долларах США. Для этого мне нужно конвертировать на основе текущих курсов.

У меня есть следующий фрагмент кода:

 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

Если я помещаю второй запрос в отдельный новый класс / репозиторий, то он работает ...

...