Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate能否将NULL映射到非数字浮点?_Java_Hibernate_Floating Point - Fatal编程技术网

Java Hibernate能否将NULL映射到非数字浮点?

Java Hibernate能否将NULL映射到非数字浮点?,java,hibernate,floating-point,Java,Hibernate,Floating Point,以下是我对特定列的Hibernate映射: 在数据库(Postgres)中,该列为max_rating double precision,即在表中可为空。正在映射的Java类有一个成员private float maxRating 在不更改表定义或类的情况下,是否有办法让Hibernate将此列中的NULL值映射到实例中的Float.NaN package my.pkg.type; public class NullNanFloatType implements UserType {

以下是我对特定列的Hibernate映射:

在数据库(Postgres)中,该列为
max_rating double precision
,即在表中可为空。正在映射的Java类有一个成员
private float maxRating


在不更改表定义或类的情况下,是否有办法让Hibernate将此列中的
NULL
值映射到实例中的
Float.NaN

package my.pkg.type;

public class NullNanFloatType implements UserType {

    public int[] sqlTypes() {
        return new int[]{Types.FLOAT};
    }

    public Class returnedClass() {
        return Float.class;
    }

    public boolean equals(Object x, Object y) throws HibernateException {
        return ( x == y ) || ( x != null && x.equals( y ) );
    }

    public int hashCode(Object x) throws HibernateException {
        return x.hashCode();
    }

    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
        float value = rs.getFloat(names[0]);
        if (rs.wasNull()) {
            value = Float.NaN;
        }
        return new Float(value);
    }

    public void nullSafeSet(PreparedStatement ps, Object value, int index) throws HibernateException, SQLException {
        if (value == null || Float.isNaN(((Float)value).floatValue())) {
            ps.setNull(index, Types.FLOAT);
        } else {
            ps.setFloat(index, ((Float)value).floatValue());
        }
    }

    public Object deepCopy(Object value) throws HibernateException {
        //returning value should be OK since floats are immutable
        return value;
    }

    public boolean isMutable() {
        return false;
    }

    public Serializable disassemble(Object value) throws HibernateException {
        return (Serializable) value;
    }

    public Object assemble(Serializable cached, Object owner) throws HibernateException {
        return cached;
    }

    public Object replace(Object original, Object target, Object owner) throws HibernateException {
        return original;
    }
}
然后您应该能够将属性映射设置为

<property name="maxRating" 
          not-null="false" 
          column="max_rating" 
          type="my.pkg.type.NullNanFloatType" />


这是否会要求映射类将其属性类型从
float
更改为
java.lang.float
,从而违反问题的约束条件?如果是这样,那么
UserType
似乎不是一个可行的解决方案,因为它的
nullSafeGet
nullSafeSet
方法使用
Object
,因此禁止原语。这不是问题,因为Hibernate在内部使用包装类来表示原语。我在Hibernate 3.6.1中尝试过这个解决方案,没有遇到任何问题。我知道,Hibernate对原语有特定的逻辑。我来试一试。