持久时间戳类型只有没有时间的日期

时间:2011-10-20 07:26:56

标签: java jpa

在我的数据库中,我想只保存数据而没有时间。 如果我使用日历或日期类型,我可以写:

@Column(name = "CDATE")
@Temporal(TemporalType.DATE)
Calendar cDate; // or Date cDate

但如果我想使用Timestamp数据类型,则时态注释不会使用时间戳类型:

@Column(name = "CDATE")
@Temporal(TemporalType.DATE)
Timestamp cDate;

我知道,使用Timestamp日期类型不是首选,但我需要根据我的架构。而且我不希望每次都将零值设置为我的cDate中的分钟,小时和其他单位。 有什么方法可以解决它。 附:我使用开放的JPA和Oracle数据库。

2 个答案:

答案 0 :(得分:3)

在Oracle 10中,您只有DATE列类型,您可以通过在实体类的列的注释中设置大小来确定日期或时间戳的类型

        @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "START_DT", table="PART_DETL", nullable = false, length = 13)
    public Date getTbl1StartDt() {
        return this.tbl1StartDt;
    }

对于约会,请使用此...

        @Temporal(TemporalType.DATE)
    @Column(name = "START_DT", table="PART_DETL"/*, nullable = false, length = 13*/)
    public Date getTbl1StartDt() {
        return this.tbl1StartDt;
    }
    public void setTbl1StartDt(Date tbl1StartDt) {
        this.tbl1StartDt = tbl1StartDt;
    }

答案 1 :(得分:0)

如果你想保留一个没有时间组件的时间戳(假设你只想要时间为00:00:00),你需要将时间设置为零。

它并不是一个很好的编程示例,但经过一些搜索我只是将给定日期转换为日历并将小时/分钟/秒/毫秒设置为零。

private Date stripTimeFromDate(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);

    calendar.set(Calendar.HOUR_OF_DAY, 0);  
    calendar.set(Calendar.MINUTE, 0);  
    calendar.set(Calendar.SECOND, 0);  
    calendar.set(Calendar.MILLISECOND, 0);

    return calendar.getTime();
}

我使用它去除查询的参数,以确保between语句的'from'和'to'参数不包含time元素。

据我所知,JPA中没有注释能够满足您的需求。如果您设置的值没有实体上将持久化的时间组件,我认为您会没事的。