java - 比较 hibernate 映射日期?

标签 java hibernate date

如何使用 Hibernate 将日期从 Java 对象映射到数据库?我尝试了不同的方法,但我对它们不满意。为什么?让我解释一下我的问题。我有以下类 [1],包括我调用的主要方法和以下映射 [2]。当您查看控制台输出时,您可以看到有关此方法的问题。

false

false

1

-1

1224754335648

1224754335000

Thu Oct 23 11:32:15 CEST 2008

Clock@67064

如您所见,截止日期并不完全相等,尽管它们应该相等,因此如果不绕过 getTime 的返回值就很难比较它们。我还在映射中尝试了 java.sql.Date、Timestamp 和 date 而不是 timestamp,但没有成功。

我想知道为什么最后三位数字是零,这是 hibernate 或 Java 问题还是我自己的愚蠢。

感谢阅读。

[1]

public class Clock {

    int id;
    java.util.Date date;

    public static void main(String[] args) {
        HibernateUtil.init();
        HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();

        Clock clock = new Clock();
        clock.date = new java.util.Date();

        HibernateUtil.getSessionFactory().getCurrentSession().saveOrUpdate(clock);
        HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();

        HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();

        Clock fromDBClock = (Clock)HibernateUtil.getSessionFactory()
                        .getCurrentSession().get(Clock.class, 1);

        System.out.println(clock.date.equals(fromDBClock.date));
        System.out.println(fromDBClock.date.equals(clock.date));

        System.out.println(clock.date.compareTo(fromDBClock.date));
        System.out.println(fromDBClock.date.compareTo(clock.date));

        System.out.println(clock.date.getTime());
        System.out.println(fromDBClock.date.getTime());

        System.out.println(clock.date.toString());
        System.out.println(fromDBClock.toString());

        HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();

        HibernateUtil.end();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public java.util.Date getDate() {
        return date;
    }

    public void setDate(java.util.Date date) {
        this.date = date;
    }


}

[2]

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="Clock" table="CLOCK">
        <id name="id" column="CLOCK_ID">
            <generator class="native"/>
        </id>
        <property name="date" type="timestamp"/>


    </class>

</hibernate-mapping>

最佳答案

MySql DateTime 精确到秒。 Java Date 精确到毫秒。 这就是为什么最后三位数字在放入数据库后为零的原因。

对您的原始日期执行此操作:

日期 = date.setTime((date.getTime()/1000) * 1000);

这会将其设置为最后一秒,然后您的所有比较都会匹配。

(顺便说一句, System.out.println(fromDBClock.toString()); 应该 System.out.println(fromDBClock.date.toString());

关于java - 比较 hibernate 映射日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/229143/

相关文章:

java - Java 中日期的年差

html - Chrome 中日期类型输入元素的清除按钮在哪里?

mysql - 将行中的所有列从日期转换为时间戳 MySQL

Java运行时执行程序有延迟

java - Jackson 反序列化抽象类的子类的对象列表

java - 无法解析导入 org.apache.olingo.commons.api.format.ODataFormat

java - 如何以树形 View 显示消息回复? Java 和 hibernate

java - 疯狂变量、舍入数(int、double 等)

java - 什么是 package-info.java,如何将它添加到我的项目中?

java - Native SQL(使用 MySQL)与使用 Hibernate ORM 的性能差异?