1

我正在使用 Hibernate 3.x、MySQL 4.1.20 和 Java 1.6。我将 Hibernate Timestamp 映射到 MySQL TIMESTAMP。到现在为止还挺好。问题是 MySQL 以秒为单位存储 TIMESTAMP 并丢弃毫秒,我现在需要毫秒精度。我想我可以在我的表中使用 BIGINT 而不是 TIMESTAMP 并转换我的 Java 代码中的类型。我试图弄清楚是否有更好的方法使用休眠、mysql、JDBC 或某种组合来执行此操作,以便我仍然可以在我的 HSQL 和/或 SQL 查询中使用日期函数?

4

4 回答 4

3

另外,看看创建一个自定义的 Hibernate Type 实现。类似于(伪代码,因为我没有方便的环境来使其防弹):

public class CalendarBigIntType extends org.hibernate.type.CalendarType {
    public Object get(ResultSet rs, String name) {
        return cal = new GregorianCalendar(rs.getLong(name));
    }
    public void set(PreparedStatement stmt, Object value, int index) {
        stmt.setParameter(index, ((Calendar) value).getTime());
    }
}

然后,您需要使用休眠的 TypeDef 和 Type 映射来映射您的新对象。如果您使用的是 Hibernate 注释,则应遵循以下原则:

@TypeDef (name="bigIntCalendar", typeClass=CalendarBigIntType.class)
@Entity
public class MyEntity {
    @Type(type="bigIntCalendar")
    private Calendar myDate;
}
于 2008-12-16T13:39:13.997 回答
1

对于那些仍然对此问题感兴趣的人:MySQL 5.6.4 支持精确的时间戳。将 MySQL5Dialect 子类化以覆盖使用的 MySQL 类型可以解决问题。

于 2014-03-23T21:49:19.510 回答
0

除了 TIMESTAMP 字段之外,为什么不使用它呢?您将有一个字段(已定义)用于存储日期,没有毫秒,另一个字段用于毫秒。您仍然可以在第一个字段上运行 HSQL 查询,除非您必须确保正确存储毫秒(通过在使用 Hibernate 存储它之前解析 Java Date 对象)。

于 2008-12-15T19:39:50.977 回答
0

我将我的数据类型从时间戳更改为十进制(17,3)并编写了一些辅助方法

public static Calendar bigDec2Cal(BigDecimal tsp) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(tsp.longValue());
    return cal;
}

public static Date bigDec2Date(BigDecimal tsp) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(tsp.longValue());
    return cal.getTime();
}

public static BigDecimal cal2BigDec(Calendar cal) {
    BigDecimal tsp = new BigDecimal(cal.getTimeInMillis());
    return tsp;
}

public static BigDecimal date2BigDec(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    BigDecimal tsp = new BigDecimal(cal.getTimeInMillis());
    return tsp;
}
于 2010-08-11T23:12:58.000 回答