java - Hibernate 可以将 NULL 映射到非数字 float 吗?

标签 java hibernate floating-point

这是我对特定列的 Hibernate 映射:

<property name="maxRating" not-null="false" column="max_rating"/>

在数据库(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" />

关于java - Hibernate 可以将 NULL 映射到非数字 float 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7046705/

相关文章:

hibernate - Jersey 注入(inject) RequestScoped IllegalStateException

java - void函数中的return语句有什么用

java - Hibernate Cascade 来自另一个数据库的另一个 ID

java - 如何在不使用 JOIN 的情况下为 JPQL 中的 Collection 子句执行参数绑定(bind)?

java - 浮点错误

c - 一个 4 字节如何存储 3.4e38 这么大的值

objective-c - 如何将char *转换为float xcode

java - 如何在java中根据条件对值进行分组

java - Gradle 包装器版本问题

java - 单元测试目录是否存在 - Junit