在旧项目中的时间类型为 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; } };