Spring框架存储库查询返回null

时间:2018-10-31 16:11:36

标签: java spring spring-data-jpa jpql

我正在编写货币换算代码。

我具有以下存储库界面:

@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的方法,这是一种不断返回null值的方法:

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);

此查询使我不断将nullTo货币成功替换为EUR,但未找到数据库记录...

我还尝试了列表搜索:

List<FxRate> findMidPrice(String currencyTo);

...,然后使用:

List<FxRate> midPriceList = fxRateRepository.findMidPrice(amountCurrency);
BigDecimal midPrice = midPriceList.get(0).getMidPrice();

也给出空值...

我不明白为什么它不能返回正确的值,尽管它与findByCurrencyCode一起使用就像一个魅力。...

有什么主意吗?


更新

如果我将第二个查询放到一个单独的新类/存储库中,则它正在运行...

0 个答案:

没有答案