【问题标题】:JPA entity: get the hours,minutes and sec from Oracle DATE columnJPA 实体:从 Oracle DATE 列中获取小时、分钟和秒
【发布时间】:2011-09-14 21:47:01
【问题描述】:

我无法从我的 Oracle DB (dd/mm/yyyy hh/mm/ss) 获取完整的 DATE 信息。

在 db 级别,在我想要接收的列中设置测试值:

update my_table
set my_date_column=(to_date('2011-06-15 15:43:12', 'yyyy-mm-dd hh24:mi:ss'));

但在我的 JPA 实体中,我有:

@Column(name = "MY_DATE_COLUMN")
@Temporal(TemporalType.DATE)
private Date dateDetailed;


public Date getDateDetailed() {
    if (this.dateDetailed!= null) {
        return this.dateDetailed;
    }
    return null;
}

public void setDateDetailed(Date dateDetailed) {
    if (dateDetailed!= null) {
        this.dateDetailed= dateDetailed;
    } else {
        this.dateDetailed= null;
    }
}

每次我访问我的对象时,它都会给我一个没有小时、分钟和秒的日期。

我尝试使用 TemporalType.TIMESTAMP,但在这种情况下,我还需要更改 db 中的列类型(我想避免这种情况)。

有什么建议吗?

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    它是TemporalType.DATE 您将需要 TIME 或 TIMESTAMP。 DATE 只是没有时间的日期。 TIMESTAMP 表示为一个数字。

    【讨论】:

    • TemporalType.DATETIME 是无效的 javax.persistence.TemporalType 类型。只有 DATE、TIME 和 TIMESTAMP 是有效的。如果我使用 TIMESTAMP,那么我必须将我的数据库中的列类型更改为 TIMESTAMP 而不是 DATE,如果可能的话,我想避免这种情况。
    • 不幸的是,无论如何您都需要这样做。如果创建 DATE 类型的 Oracle 列,它不会将时间信息与日期一起存储,例如,create table foo (bar date);。如果您创建此表,然后执行您提到的插入,您会注意到时间信息已被删除,并且该列仅包含 15-JUN-2011 而不是预期的 15-JUN-11 03.43.12.000000000 PM(从 sql dev 输出中看到)。 DB 列必须能够支持数据,以便 JPA 提供所需的功能。
    • @Kris 在这种情况下,你能解释一下为什么,如果在 DATE 列中我只能存储日期,我的选择给了我真正的价值,包括小时、分钟和秒?还有为什么,使用 DATE 列类型,使用 EJB2 实体 bean,我可以检索小时、分钟和秒?
    • 这是一个有趣的问题。表中使用的确切列定义是什么?我已经按照我在 Oracle 10g 数据库中的描述测试了这个场景,并看到了描述的结果。如果您确实得到了您描述的结果,那么只需将 JPA 注释从 TemporalType.DATE' to TemporatlType.TIMESTAMP` 转换为您的特定情况,无需任何数据库修改。
    • download.oracle.com/docs/cd/B19306_01/server.102/b14225/… 其书面形式为 DATE 类型,我们可以存储日期和时间。问题帖子中的我的 sql 能够从该列设置/接收时间。只是将 TemporalType.DATE' 更改为 TemporatlType.TIMESTAMP 给了我部署异常:错误的列类型。也许问题是,在选择 my_column 中,类型为 DATE 默认情况下只给我日期,默认选择 my_column 类型为 TIMESTAMP 给我 DATE 和 TIME..
    【解决方案2】:

    通过使用 TIMESTAMP 时间类型,您将获得 java 日期数据类型的日期和时间部分,但 Oracle 将使用 TIMESTAMP 数据类型创建一个列。如果您需要 DATE 数据类型,要解决此问题,可以使用列注释的 columnDefinition 参数,例如:

    @Column(name = "MY_DATE_COLUMN", columnDefinition = "DATE")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateDetailed;
    

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多