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