【问题标题】:Hibernate date mapping problem休眠日期映射问题
【发布时间】:2010-07-27 10:27:33
【问题描述】:

我正在使用 SQL Server 数据库和 Hibernate。我有以下与存储日期相关的问题:

我有以下代码:

String hql = "select user from User user where user.createDate = :date";
Query query = HibernateUtil.getSession().createQuery(hql);
Date date2 = DateHelper.getEndOfDay(new Date());//this returns 2010-07-27 23:59:59.999
query.setParameter("date", date2);

当我比较日期2010-07-27 23:59:59.999 时,我得到的结果有一个日期:2010-07-28 00:00:00.0。使用 setDate() 代替 setParameter() 返回保存日期在同一天的用户,这意味着小时、分钟等被丢弃。

休眠将日期映射到 java.util.Date 但在结果列表中,我猜一切都是时间戳,因为时间戳扩展了 java.util.Date。 在比较相等性时,您会建议怎样做才能获得好的结果?

【问题讨论】:

    标签: java hibernate datetime


    【解决方案1】:

    您尝试过Query.setDate()Query.setTimestamp() 吗?

    【讨论】:

    • setDate() 不好,因为它会将日期在同一天的所有用户返回给我,这意味着小时和秒等被丢弃。
    • 但时间戳应该没问题。 (如果你从你的约会中得到毫)。 (+1)
    • 在您的问题中,您多次提到“日期”,所以我不确定您的意思是“日期”还是“日期/时间”,并包含在我的答案中。
    • 似乎不是 Hibernate 是问题的原因,而是 MSSQL,因为它以 3 毫秒的精度保存日期。在数据库上运行相同的查询会产生相同的问题。我认为最好的解决方案是在保存日期之前格式化日期,以便毫秒部分始终为 0。
    【解决方案2】:

    我认为问题出在 MSSQL 数据库上,因为它以 3 毫秒的精度保存日期,如 this 帖子的答案之一所示。

    所以问题是,由于时间 23:59:59.999 无法保存在 MSSQL 中(可能以 3 毫秒的精度与从数据库中检索到的时间相比,您永远无法得到 999,此时必须转换,并且当将其转换为一些与 MSSQL 兼容的日期,它最终是第二天。

    我认为这是我在这里看到的真正问题。为了避免这种情况,我认为我应该格式化保存的日期。

    【讨论】:

      【解决方案3】:

      如果可能,我建议您使用JODA DateTime API。使用来自joda-hibernate projectPersistentDateTime Hibernate User Type 类将DateTime 对象持久化到数据库中。

      【讨论】:

      • 除了使用这个API还有其他选择吗?
      • 不使用 Joda Time 不是问题。
      • 只是这个 API 有一些惊人的便利/常识方法,否则在自定义开发项目中很难弄清楚。当然,如果您不专门使用这个,这不是一个“问题”。如果没有替代品,我会感到惊讶。有人知道有什么好的替代品吗?
      猜你喜欢
      • 2014-01-06
      • 1970-01-01
      • 2020-05-15
      • 2018-01-29
      • 2011-01-31
      • 1970-01-01
      • 2010-09-18
      • 2014-05-12
      • 2021-01-13
      相关资源
      最近更新 更多