【问题标题】:Spring Data and Oracle returns different result from query? Why?Spring Data 和 Oracle 从查询返回不同的结果?为什么?
【发布时间】:2019-06-28 16:15:01
【问题描述】:

我的 JPA 查询非常复杂,因为我使用的是 nativequery,但是当我运行它时,它会返回来自 JAVA 查询和 Oracle 查询的不同结果。但是 Oracle 查询返回正确的结果。这可能是什么原因?

我更改了 SELECT 语句,尝试通过 a.* 获取所有这些语句,并尝试仅获取必要的列。我还删除了 DATE 比较语句。然而有趣的是,JPA 查询返回 4 行,并且它们都完全相同。我也尝试在 DATE 比较部分获取没有 TRUNC 关键字的数据,但它不起作用。此外,我在本机查询中的表前添加了模式名称,这不再有效。

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 字段。

【问题讨论】:

  • 欢迎加入 Doruk,向我们展示您使用 Oracle 获得的结果以及使用 Oracle 的查询。同时向我们展示您使用 ORM 策略获得的结果。

标签: java oracle spring-boot spring-data-jpa


【解决方案1】:

我又找到了解决方案!有趣的是!下面是我的新代码,我只是没有将我的本机查询映射到实体,并返回一些 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));

这是我所做的唯一更改。我仍然不知道它为什么起作用?。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多