如何将对象与Date变量(Hibernate)进行比较? java.util.Date vs java.sql.Timestamp

时间:2014-05-28 17:54:14

标签: java hibernate date java-ee timestamp

环境:

  • MySql 5.6.14
  • Spring MVC
  • 休眠

我在检查2个对象是否相等时遇到问题,问题是由de variable Date引起的。

我正在使用Hibernate,它似乎是Timestamp(纳秒)和Date(毫秒)的问题。

当我创建对象时,任务日期与我从数据库中检索对象时不同。

java.util.Date date = new java.util.Date();
java.sql.Date datesql = new java.sql.Date(date.getTime());
java.util.Date stamp = new java.sql.Timestamp(date.getTime());
Date rightnow = stamp;//Calendar.getInstance().getTime();

Task t1 = new Task("My first task", "This is a task", rightnow,
        rightnow, category, priority, state, user, user, "okey", 0);
Task t2 = new Task("My second task", "This is a task", date,
        rightnow, category, priority, state, user, user, "okey", 0);
Task t3 = new Task("My third task", "This is a task", datesql,
        rightnow, category, priority, state, user, user, "okey", 0);
    taskDao.saveOrUpdate(t1);
taskDao.saveOrUpdate(t2);
taskDao.saveOrUpdate(t3);
taskDao.saveOrUpdate(t4);

List<Task> tasks = taskDao.getAllTasks();
assertEquals("Should be 4 tasks.", 4, tasks.size());

Task taskR1 = taskDao.get(t1.getIdTask());
Task taskR2 = taskDao.get(t2.getIdTask());
Task taskR3 = taskDao.get(t3.getIdTask());
//Dates before saving objects in database
System.out.println("l timestamp> "+rightnow.getTime());
System.out.println("l date     > "+date.getTime());
System.out.println("l datesql  > "+datesql.getTime());
//Dates from retrieved objects
System.out.println("l tr1date  > "+taskR1.getDate().getTime());
System.out.println("l tr2date  > "+taskR2.getDate().getTime());
System.out.println("l tr3date  > "+taskR3.getDate().getTime());

此代码的结果

//Dates before saving objects in database
l timestamp> 1401298705937
l date     > 1401298705937
l datesql  > 1401298705937
//Dates from retrieved objects
l tr1date  > 1401298706000
l tr2date  > 1401298706000
l tr3date  > 1401298706000

问题是比较1401298705937(保存对象前的日期)和1401298706000(保存对象后的日期)不同。

我也尝试过compareTo和equals函数

System.out.println("t3.getDate().compareTo(taskR3.getDate()) == 0 :" 
  + (t3.getDate().compareTo(taskR3.getDate()) == 0));
System.out.println("t3.getDate().equal(taskR3.getDate()) == 0 :" 
  + (t3.getDate().compareTo(taskR3.getDate()) == 0));
System.out.println("taskR3.getDate().compareTo(t3.getDate()) == 0 :" 
  + (t3.getDate().compareTo(taskR3.getDate()) == 0));
System.out.println("taskR3.getDate().equal(t3.getDate()) == 0 :" 
  + (t3.getDate().compareTo(taskR3.getDate()) == 0));

结果为假,对象为t1,t2和taskR1,taskR2。

t3.getDate().compareTo(taskR3.getDate()) == 0 :false
t3.getDate().equal(taskR3.getDate()) == 0 :false
taskR3.getDate().compareTo(t3.getDate()) == 0 :false
taskR3.getDate().equal(t3.getDate()) == 0 :false

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

从你的例子:

1401298705937 = 2014年5月28日星期三17:38:25 GMT 1401298706000 = 2014年5月28日星期三17:38:26 GMT

这意味着数据库只是剥离了毫秒。

根据Hibernate docs

  • java.util.Date
  • 的java.sql.Timestamp
  • java.util.Calendar中

都映射到JDBC TIMESTAMP。

从现在开始,它是负责存储时间戳而不是所有版本的数据库能够处理毫秒。

  

TIMESTAMP数据类型用于包含date和的值   时间部分。 TIMESTAMP的范围是'1970-01-01 00:00:01'UTC到   '2038-01-19 03:14:07'UTC。

是否使用MySQL 5.5或更低版本?

答案 1 :(得分:0)

在此之前,使用Hibernate将日期插入MySQL

 1401298705937 = Wed, 28 May 2014 17:38:25 GMT

之后,使用Hibernate从MySQL恢复日期

 1401298706000 = Wed, 28 May 2014 17:38:26 GMT

日期值已从1401298705937(milis)四舍五入到1401298706000(milis),这就是为什么对象不是compareTo()== 0

解决方案我发现,在设置Date或Timestamp之前排除milis并使用hibernate保存对象。

new java.util.Date((date.getTime()/1000)*1000)