我需要访问现有的MySQL数据库,该数据库使用BIGINT
列存储时间戳:
create table mytable (created bigint);
现在我更喜欢使用java.util.Date
或java.time.Instant
实例而不是整数,所以我试图让Hibernate直接转换值。不幸的是,Hibernate不会识别这样注释的列:
@Column(name = "created")
private Date created;
或者像这样:
@Column(name = "created")
@Temporal(TemporalType.TIMESTAMP)
private Calendar created;
这确实会在将来返回类似2017-07-01T04:14:00 02:00
。如何使Hibernate convertBIGINT
列正确转换,从而不必在getter和setter中转换它们?
Hibernate的TemporalType。时间戳映射到java。sql。时间戳
。Timestamp
构造函数采用长值,即自历元起的毫秒数。数据库中的值存储为Unix时间戳,它是自历元起的秒数。
我编写了一个UnixTimestampType
,它需要几秒钟而不是几毫秒,并创建Date
实例:
public class UnixTimestampType extends AbstractSingleColumnStandardBasicType<Date> implements IdentifierType<Date>, LiteralType<Date> {
private static final long serialVersionUID = 1L;
public static final UnixTimestampType INSTANCE = new UnixTimestampType();
public UnixTimestampType() {
super(UnixTimestampTypeDescriptor.INSTANCE, JdbcDateTypeDescriptor.INSTANCE);
}
@Override
public String getName() {
return "date";
}
@Override
public String[] getRegistrationKeys() {
return new String[] { getName(), java.sql.Date.class.getName() };
}
@Override
public String objectToSQLString(Date value, Dialect dialect) throws Exception {
final java.sql.Date jdbcDate = java.sql.Date.class.isInstance(value) ? (java.sql.Date) value : new java.sql.Date(value.getTime());
return StringType.INSTANCE.objectToSQLString(jdbcDate.toString(), dialect);
}
@Override
public Date stringToObject(String xml) {
return fromString(xml);
}
}
和
public class UnixTimestampTypeDescriptor implements SqlTypeDescriptor {
private static final long serialVersionUID = 1L;
public static final UnixTimestampTypeDescriptor INSTANCE = new UnixTimestampTypeDescriptor();
@Override
public int getSqlType() {
return Types.INTEGER;
}
@Override
public boolean canBeRemapped() {
return true;
}
@Override
public <X> ValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
return new BasicBinder<X>(javaTypeDescriptor, this) {
@Override
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException {
Date date = javaTypeDescriptor.unwrap(value, Date.class, options);
date.setTime(date.getTime() / 1000);
st.setDate(index, date);
}
};
}
@Override
public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
return new BasicExtractor<X>(javaTypeDescriptor, this) {
@Override
protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException {
Date date = new Date(rs.getLong(name) * 1000);
return javaTypeDescriptor.wrap(date, options);
}
};
}
}
不支持使用s(所以当前)使用Java8 Date/Time,因为默认情况下这个版本的Spring Boot使用。要实现这一点(Spring Boot 1.5.10),请在部分覆盖该版本。 问:启用Java8日期/时间覆盖hibernate版本或以某种方式覆盖hibernate版本的最佳方法是什么(如果是,那么如何实现?)是否将JPA 2.2用于SPRING\u引导? 编辑与Hibernate我不断
我正在尝试转换java。util。日期至java。时间本地日期: 但是,当有例如22:25的一天时间时,我选择ZoneId,例如:。 即将推出的本地日期将有不同的日期(因为该区域增加了6小时),例如欧洲/明斯克: 我想在结果的LocalDate中保留与该实例相同的日期。一些方法如何解决这个问题?我想可能有几种方法。
问题内容: 如何配置JPA /hibernate模式以UTC(GMT)时区在数据库中存储日期/时间?考虑以下带注释的JPA实体: 如果日期是太平洋标准时间(PST)2018-Feb-03 9:30 am,那么我希望数据库中存储2008-Feb-03 5:30 pm的UTC时间。同样,从数据库中检索日期时,我希望将其解释为UTC。因此,在这种情况下,530pm是UTC 530pm。显示时,它将被格式
有没有一种方法可以编写一个模式,该模式解析器“要么”两个可选部分之一?类似于()? 例如: 我想分析短(
问题内容: 我们有一个Oracle日期列。首先,我们在Java / Hibernate类中使用。这可行,但是保存时似乎没有在数据库中存储任何时间信息,因此我将Java数据类型更改为Timestamp。现在我们得到这个错误: springframework.beans.factory.BeanCreationException:在类路径资源[margin-service- domain -confi
下面是我用来访问过去10天前的日期的代码。输出为'20130103',即今天的日期。我如何返回今天的日期-10天?我被限制使用内置的java日期类,所以不能使用joda时间。