这两天一直在折腾从JSP页面到Action和从Action到JSP页面,日期类型和字符串之间的转换问题。虽然折腾了两天真费劲,不过还有一点小收获。
java.util.Date 是JAVA类里常用的日期类型,这个不多说。
一直很疑惑 java.sql.Date 是做什么用的,和java.util.Date 有什么区别,昨天突然发现和明白,原来它是持久类方式查询数据库时,持久类Date类型成员属性赋值的一个格式化日期类型,它只有日期没有时间。与其对应的还有 java.sql.Timestamp(有日期有时间) 和 java.sql.Times (只有时间没有日期),可通过HQL注释进行设置。
例如:我有一个持久类
@Entity
@Table(name = "TLM_CUS_CLEARENCE", schema = "MEDEV")
public class CusClearence {public java.util.Date ccRecordedTime; //录入时间
@Temporal(TemporalType.DATE)
@Column(name = "CC_RECORDED_TIME", length = 7)
public Date getCcRecordedTime() {
return this.ccRecordedTime;
}public void setCcRecordedTime(Date ccRecordedTime) {
this.ccRecordedTime = ccRecordedTime;
}
虽然ccRecordedTime成员类型设为java.util.Date,但是通过HQL语句查询数据库并将结果对象赋给持久类后,我发觉该ccRecordedTime成员属性的类型变成了 java.sql.Date ! 且若数据库表字段存储的值为日期加时间,例如2012-01-19 13:50,而ccRecordedTime 的值只有日期,没有时间,即2012-01-19。
通过持久类保存数据到数据库时亦同,ccRecordedTime字段也只保存日期到数据库,而把时间去掉了。
相应的如果注释日期字段时间类型为 TemporalType.Timestamp 或TemporalType.Time ,则ccRecordedTime类型相应变成java.sql.Timestamp 和 java.sql.Time。 所以数据库表的日期字段 想存储哪种类型,持久类注释就可以设置为相应的类型,在从数据库取数及保存到数据库时,Hibernate就已经帮做了日期和时间之间取舍的处理。