6

次の単純なJPAエンティティがあります。

@Entity
@Table( name = myentity_table )
public class MyEntity {

  private double a;
  private double b;
  //(...)
}

abはに設定できますDouble.POSITIVE_INFINITY。標準のエンティティマネージャを使用して、+ INFにdoubleが設定されたエンティティをデータベース(MySQL)に格納しようとすると、例外が発生します。

java.sql.SQLException:'Infinity'は有効な数値または概算の数値ではありません

私の知る限り、MySQLはNaN / -INF /+INF番号をサポートしていない可能性があります。HQLクエリを記述せずに+INFをnull(またはmax double)に変換せずにこのエンティティを保存する方法はありますか?理想的には、いつものようにエンティティマネージャーを介して実行したいと思います。

前もって感謝します。

4

3 に答える 3

3

エンティティ ライフサイクル コールバック メソッド @PrePersist、@PreUpdate をここで使用して、フィールド値 NAN/-INF/+INF などを確認し、それに応じてデフォルト値を設定できます。

 //--

 @PrePersist  
 @PreUpdate  
 private void resetField() {

      if(field == Double.POSITIVE_INFINITY)
            field = somePredefinedValue;
 }

 //--
于 2011-04-27T17:44:37.583 に答える
3

MySQL は「無限」をサポートしていないようです。この記事には次のように書かれています。

MySQL データベースで負の無限大を格納および取得するには、任意の大きな負の数を挿入します。

ポジティブも同様です。他のリソースも使用します1e500

無限大を使用する代わりに、Float.MAX_VALUEand Float.MIN_VALUE(またはDouble同等のもの)を使用することをお勧めします。

値を設定するときにコードでこれを実行できない場合は、@PrePersist既に提案されているように実行してください。

于 2011-04-27T18:02:17.493 に答える
0

のテキスト表現を格納する varchar 列を追加することで、この問題を管理しましたがFloat.NaN、元の列には が格納されます。次に、setter と getter を使用して、これら 2 つの列を管理します。Float.POSITIVE_INFINITYFloat.NEGATIVE_INFINITYNULL

私の @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        |
于 2016-07-25T09:02:47.380 に答える