【发布时间】:2012-05-09 02:37:59
【问题描述】:
其中一个 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-02-01 - 注意 db 中值的自动转换 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);
非常感谢当 db 中的值为 01-FEB-12 时,我如何以 REPORTING_DATE 作为参数查询(使用 HQL 也可以)的任何帮助。
【问题讨论】:
-
您确定您使用的格式正确,可以将字符串解析为
Date吗?你可以试试DateFormat df = new SimpleDateFormat("yyyy-MM-dd");吗? -
@βнɛƨн Ǥʋяʋиɢ -- 不,实际上我之前也尝试过,但不起作用。奇怪的是,Hibernate 没有报告任何错误,只是没有结果。
-
您能给我们提供查询吗(
NamedQuery或 Critera 查询或您使用的任何内容。)我认为错误/问题出在查询中或 findByReportDate 方法中 -
在您的查询中尝试从 >= 2012-02-01 到
-
我认为就像@BruceLowe 一样,Oracle 总是 存储日期和时间(即使您不显示它)。如果您可以使用纯 sql(而不是 hibernate)查询数据库,请查看此查询的结果:
select to_char(REPORTING_DATE, 'dd/mm/yyyy hh24:mi:ss') from IR_REPORTING_PERIOD
标签: java oracle hibernate date spring-data-jpa