【问题标题】:Oracle DATE and Hibernate/JPA mappingOracle DATE 和 Hibernate/JPA 映射
【发布时间】: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


【解决方案1】:

我认为在reportingPeriodRepository.findByMaxReportingPeriod()中获取结果时有一些明确的日期格式转换;

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

改变

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2019-02-24
    • 1970-01-01
    • 2015-04-15
    • 2014-09-18
    • 2014-01-31
    • 2011-07-13
    相关资源
    最近更新 更多