Spring Data и Oracle возвращают разные результаты из запроса?Зачем? - PullRequest
0 голосов
/ 05 февраля 2019

Мой запрос JPA очень сложен, из-за этого я использую nativequery, но при запуске он возвращает разные результаты из запроса JAVA и запроса Oracle.Тем не менее, запрос Oracle возвращает правильный результат. Что может быть причиной этого?

Я изменил инструкцию SELECT, пытаюсь получить все из них с помощью. *, А также пытаюсь получить только необходимый столбец.Я также удаляю оператор сравнения DATE.Однако интересно, что запрос JPA возвращает 4 строки, и все они были точно такими же.Я также пытаюсь получить данные без ключевого слова TRUNC в части сравнения DATE, и это не работает.Кроме того, я добавляю имена схем перед таблицами в собственном запросе, который снова не работает.

public Optional<LocalDateTime> getPaymentPeriod2(LocalDate reportDate, String loanId)
{



final String reportDateParemeter = reportDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

    final String query = "SELECT st.t_no, st.islem_tarihi, st.s_kodu, st.odeme_suresi " +
                "FROM k_tarihce st, k_tanim sta, kt_tanim tta " +
                "WHERE st.s_kodu = sta.s_kodu " +
                "AND tta.s_tipi = sta.s_tipi AND tta.t_kodu = st.t_kodu " +
                "AND st.t_no = :loanId AND st.t_kodu in (37,55) " +
                "AND st.s_kodu = 'K1' AND (TRUNC(st.odeme_suresi) >= TRUNC(TO_DATE(:reportDateParemeter,'yyyy-mm-dd')))";

    final Query loanGetPaymentPeriodQuery = entityManager.createNativeQuery(query, LoanStatusHistory.class);
        loanGetPaymentPeriodQuery.setParameter("reportDateParemeter", reportDateParemeter);
        loanGetPaymentPeriodQuery.setParameter("loanId", loanId);
        List<LoanStatusHistory> loanStatusHistoryList = loanGetPaymentPeriodQuery.getResultList();

        return loanStatusHistoryList.isEmpty() ? Optional.empty() : Optional.of(loanStatusHistoryList.get(0).getPaymentPeriod());
    }

И моя сущность:

@Entity
@Table(name = "K_TARIHCE", schema = "LOS")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Cacheable(false)
@IdClass(LoanStatusHistoryId.class)
public class LoanStatusHistory {
    @Id
    @Column(name = "T_NO")
    private String loanId;
    @Id
    @Column(name = "ISLEM_TARIHI")
    private LocalDate processDate;
    @Id
    @Column(name = "S_KODU")
    private String statusCode;
    @Column(name = "ODEME_SURESI")
    private LocalDateTime paymentPeriod;
    @Column(name = "T_KODU")
    private String historyCode;
}

class LoanStatusHistoryId implements Serializable {
    private String loanId;
    private transient LocalDate processDate;
    private String statusCode;
}

Я хочу получить такой же результат у разработчика Oracle SQL.Моя главная цель - получить поле ODEME_SURESI.

1 Ответ

0 голосов
/ 05 февраля 2019

Я снова нашел решение, интересно!Вот мой новый код ниже, я просто не сопоставил свой нативный запрос с сущностью, а вернул некоторую LocalDate.

final Query loanGetPaymentPeriodQuery = entityManager.createNativeQuery(query);
            loanGetPaymentPeriodQuery.setParameter("reportDateParemeter", reportDateParemeter);
            loanGetPaymentPeriodQuery.setParameter("loanId", loanId);
            final List<LocalDate> loanStatusHistoryList = loanGetPaymentPeriodQuery.getResultList();

            return loanStatusHistoryList.isEmpty() ? Optional.empty() : Optional.of(loanStatusHistoryList.get(0));

Это единственное изменение, которое я сделал.Я до сих пор не знаю, почему это работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...