小窝

Hibernate中 date 与 timestamp 之间的转换

发布时间:5年前作者:shine热度: 1080 ℃评论数:

       在旧项目中的时间类型为 date,通过 Hibernate 映射到数据库,数据库中字段类型为 date,但是入库的字段都是有年月日时分秒的,通过 DBA 监控发现,发送到数据库的参数类型时timestamp,在数据库级别会进行一次隐式转换。

       在数据库和应用字段类型保持不变,可以通过 Hibernate 的自定义类型 userType 来进行转换,如下

    @Override
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
        if (rs.getTimestamp(names[0]) == null) {
            return null;
        }
        return Date.from(rs.getTimestamp(names[0]).toLocalDateTime().atZone(ZoneId.systemDefault()).toInstant());
    }

    @Override
    public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
        JdbcTimestampTypeDescriptor jdbcDateTypeDescriptor = JdbcTimestampTypeDescriptor.INSTANCE;
        st.setTime(index, jdbcDateTypeDescriptor.unwrap((Date) value, Time.class, NO_OPTIONS));
    }

    private static WrapperOptions NO_OPTIONS = new WrapperOptions() {
        public boolean useStreamForLobBinding() {
            return false;
        }

        public LobCreator getLobCreator() {
            return NonContextualLobCreator.INSTANCE;
        }
    };

热门评论

手机扫码访问