浮点型原语,如果可能,则返回null;如果数据库中的值为null,则返回一个特定值

时间:2019-11-26 16:38:47

标签: java jpa

基本上,正如标题所提到的,这就是我要尝试的操作,我已定义了此列

@Column(name="MATCH_SCORE", columnDefinition="NUMBER(10,4) default '-1.0000'")
private float matchScore;

所以我期望的是,如果该值在数据库中为空,则该值将以-1返回,但是,我仍然将其返回为0,这是一个问题,因为如果我在该值为0时必须采取特定的措施不幸的是,如果值是null,请不要这样做。不幸的是,我无法更改数据库,因此必须从应用程序一侧进行操作。

干杯。

2 个答案:

答案 0 :(得分:2)

部分问题可能是原始float不能为null。相反,您可以使用Float,但是映射NUMBER(精确度)列的更好选择是BigDecimal。试试这个版本:

@Column(name="MATCH_SCORE", columnDefinition="NUMBER(10,4) default -1.0000")
private BigDecimal matchScore;

还请注意,列默认值的目的是,如果发生插入并且未为该列指定任何值(或NULL),则数据库将改用该默认值。默认值实际上与选择时发生的事情无关。该记录的列中的任何值都将返回。

答案 1 :(得分:0)

如果要使用基本类型float,而不是也没有舍入问题的可为空的BigDecimal,请执行

@Column(name="MATCH_SCORE", columnDefinition="NUMBER(10,4)")
private Float matchScoreRaw;

@Transient
public float getMatchScore() {
    return matchScoreRaw == null ? Float.NaN : matchScoreRaw;
}

@Deprecated
public Float getMatchScoreRaw() {
    return matchScoreRaw == null ? Float.NaN : matchScoreRaw; // Bad.
}

将数据库的NULL表示为非数字。使用原始值的吸气剂可能有助于“修复”数据库,尽管使用NULL可能更好,因为我不知道NaN在数据库中如何表示以及是否可以再次读取。

最好是将所有NULL条目转换为某种东西,而不使用两个字段。