我遇到了完全相同的问题,在这些解决方案的指导下,我还准备了一个自定义类型类扩展 DoubleType。在该类中,我在 set 函数中将 NaN 值转换为 null,对于 get 函数反之亦然,因为 null 对于我的数据库列是可以的。我还将 NaN 可能列的映射更改为自定义类型类。该解决方案非常适合休眠 3.3.2。
不幸的是,在将 Hibernate 升级到 3.6.10 后,它停止了工作。为了让它再次工作,我将自定义类型从扩展 DoubleType 替换为实现 UserType。
重要的数据类型函数实现应该如下:
private int[] types = { Types.DOUBLE };
public int[] sqlTypes()
{
return types;
}
@SuppressWarnings("rawtypes")
public Class returnedClass()
{
return Double.class;
}
以下是 get 和 set 函数:
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException
{
Double value = rs.getDouble(names[0]);
if (rs.wasNull())
return Double.NaN;
else
return value;
}
public void nullSafeSet(PreparedStatement ps, Object value, int index) throws HibernateException, SQLException
{
Double dbl = (Double) value;
if ((dbl == null) || (Double.isNaN(dbl)))
ps.setNull(index, Types.DOUBLE);
else
ps.setDouble(index, dbl);
}