Oracle DATE 和 Hibernate/JPA 映射

3

其中一个 Oracle 表格的结构如下,我无法更改:

REPORTING_PERIOD | REPORTING_DATE (Oracle DATE type)
-------------------------------
1140               01-FEB-12
1139               01-JAN-12

JPA实体(使用Hibernate作为提供者)如下所示:
@Column(name="REPORTING_PERIOD")
private long reportingPeriod;

@Temporal( TemporalType.DATE)
@Column(name="REPORT_DATE")
private Date reportDate; //java.util.Date

现在,让我们浏览我的单元测试: (我使用 Spring Data JPA 作为存储库) 下面一行代码通过 REPORTING_PERIOD 列查询数据库。

ReportingPeriod period1 = reportingPeriodRepository.findByMaxReportingPeriod();
assertNotNull(period1); // works fine and entity is fetched
System.out.println(period1.getReportDate());

SOP的输出是2012年2月1日 - 注意自动从数据库中的值01-FEB-12进行的转换。

现在,如果我直接使用“01-FEB-12”查询日期,就像下面这样做一样,我将不会得到任何结果:

ReportingPeriod period2 = reportingPeriodRepository.findByReportDate(period1.getReportDate());
assertNotNull(period2);

请注意,我正在使用来自同一实体的日期字段,这个字段在之前的语句中已成功获取。
也不起作用:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
ReportingPeriod period3 = reportingPeriodRepository.findByReportDate(df.parse("2012-02-01"));
assertNotNull(period3);

任何关于如何查询(使用 HQL 也可以)以 REPORTING_DATE 作为参数,当数据库中的值是 01-FEB-12 时,都将不胜感激。

@βнɛƨн Ǥʋяʋиɢ -- 不行,我之前也试过了,但是不起作用。奇怪的是,Hibernate没有报告任何错误,只是没有结果。 - SRK
自动生成的 Hibernate SQL:org.hibernate.SQL - select * from ( select reportingp0_.REPORTING_PERIOD as REPORTING1_3_, reportingp0_.REP_TIMESTAMP as REP2_3_, reportingp0_.REPORT_DATE as REPORT3_3_ from IR_REPORTING_PERIOD reportingp0_ where reportingp0_.REPORT_DATE=? ) where rownum <= ? - SRK
1
尝试在查询中使用日期范围从>= 2012-02-01到<2012-02-02,并查看是否有任何结果。有时候,你认为你正在处理一个日期,但实际上它是以日期时间的形式存储的。 - Bruce Lowe
2
我认为像@BruceLowe一样,Oracle 始终 存储带有时间的日期(即使您不显示它)。如果您可以使用纯SQL(而不是Hibernate)查询数据库,请查看此查询的结果:select to_char(REPORTING_DATE, 'dd/mm/yyyy hh24:mi:ss') from IR_REPORTING_PERIOD - A.B.Cade
+1 给 @BruceLowe 和 @A.B.Cade;它起作用了!!它确实存储 DateTime。 - SRK
显示剩余3条评论
1个回答

3

我认为在使用reportingPeriodRepository.findByMaxReportingPeriod()方法获取结果时,可能存在一些明确的日期格式转换。

因此,我们可以检查是否使用与数据库格式相同的格式获取数据。

更改:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 
ReportingPeriod period3 = reportingPeriodRepository.findByReportDate(df.parse("2012-02-01"))

to

DateFormat df = new SimpleDateFormat("dd-MMM-yy"); 
ReportingPeriod period3 = reportingPeriodRepository.findByReportDate(df.parse("01-FEB-12"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接