Я решил эту проблему, добавив столбец varchar для хранения текстового представления Float.NaN
, Float.POSITIVE_INFINITY
и Float.NEGATIVE_INFINITY
, в то время как исходный столбец будет хранить NULL
.
Затем я использую установщик и получатель для управления этими двумя столбцами.
В моем классе @Entity
/** The value I persist. See it is a Float; */
@Column(name = "VALUE")
private Float value;
/** the 'value complement' that does the trick. */
@Column(name = "VALUE_COMPLEMENT") // You can see I've added a new column in my table (it is a varchar)
private String valueComplement;
/**
* value getter.
* If my value is null, it could mean that it is a NaN or +/- infinity.
* Then let's check the complement.
*/
public Float getValue() {
if (value == null) {
try {
return Float.parseFloat(this.valueComplement);
} catch (NumberFormatException e) {
return null;
}
} else {
return value;
}
}
/**
* value setter
* If the given value is a NaN or Inf, set this.value to null
* and this.complement to the string representation of NaN or +/- Inf.
*/
public void setValue(Float value) {
if (value != null && (value.isNaN() || value.isInfinite())) {
this.valueComplement = value.toString();
this.value = null;
} else {
this.value = value;
}
}
Результат:
| ID | LABEL | VALUE | VALUE_COMPLEMENT |
| -- | --------------------- | ----- | ---------------- |
| 1 | PI | 3.14 | NULL |
| 2 | gravity acceleration | 9.81 | NULL |
| 3 | sqare root of -1 | NULL | NaN |
| 4 | log of 0 | NULL | -Infinity |