私はまったく同じ問題を抱えていました。これらの解決策のガイダンスに従って、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);
}