当前位置: 首页 > 知识库问答 >
问题:

对java使用BIGINT列。util。日期或java。时间JPA/Hibernate中的即时

祁乐邦
2023-03-14

我需要访问现有的MySQL数据库,该数据库使用BIGINT列存储时间戳:

create table mytable (created bigint);

现在我更喜欢使用java.util.Datejava.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中转换它们?

共有1个答案

云凌
2023-03-14

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时间。