加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Hibernate可以将NULL映射到非数字浮点数吗?

发布时间:2020-12-14 19:15:40 所属栏目:Java 来源:网络整理
导读:这是我对特定列的Hibernate映射: 在数据库(Postgres)中,列是max_rating双精度,即它在表中可以为空.要映射的Java类具有成员私有浮点数maxRating. 在不更改表定义或类的情况下,有没有办法让Hibernate将此列中的NULL值映射到实例中的Float.NaN? 最佳答案 您应

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

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

在数据库(Postgres)中,列是max_rating双精度,即它在表中可以为空.要映射的Java类具有成员私有浮点数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;
    }
}

然后你应该能够将属性映射设置为

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读