sql >> データベース >  >> RDS >> Oracle

JOOQOracle数値の精度とJava数値のマッピング

    Javaの整数型は、OracleのNUMBERと完全には一致しません。 種類。基本的に、世界間でマッピングする方法は2つあり、どちらも不完全です。

    • 現状: 厳密にNUMBER(3)未満 ->Byte

      これにより、SQL値を常にそのJava型に読み取ることができることが保証されます。一部のJava値はSQL型に書き込めない場合があります。

    • 代替案: Byte -> NUMBER(3) 以下。

      これにより、Javaのbyte 値はいつでもデータベースに書き込むことができます。ただし、一部のDB値はJavaタイプに読み取れない場合があります。

    jOOQは、次の仮定のため、デフォルトで最初のものになります。

    • jOOQは主に「データベースファースト」APIとして使用されます
    • ほとんどのデータはDBから読み取られ、DBに書き込まれません

    デフォルトの動作

    jOOQ 3.8.4では、次のロジックが DefaultDataType.getNumericClass()

    // Integers
    if (scale == 0 && precision != 0) {
        if (precision < BYTE_PRECISION) {
            return Byte.class;
        }
        if (precision < SHORT_PRECISION) {
            return Short.class;
        }
        if (precision < INTEGER_PRECISION) {
            return Integer.class;
        }
        if (precision < LONG_PRECISION) {
            return Long.class;
        }
    
        // Default integer number
        return BigInteger.class;
    }
    
    // Non-integers
    else {
        return BigDecimal.class;
    }
    

    あり:

    int LONG_PRECISION    = String.valueOf(Long.MAX_VALUE).length();    // 19
    int INTEGER_PRECISION = String.valueOf(Integer.MAX_VALUE).length(); // 10
    int SHORT_PRECISION   = String.valueOf(Short.MAX_VALUE).length();   // 5
    int BYTE_PRECISION    = String.valueOf(Byte.MAX_VALUE).length();    // 3
    

    デフォルトのオーバーライド

    場合によっては、NUMBER(3)を使用します byteを保存する 127までの番号 たとえば、コード生成フェーズでデータ型の書き換えを指定することで、このデフォルトをオーバーライドできます。これはここに文書化されています:

    http://www.jooq.org/doc / latest / manual / code-generation / data-type-rewrites




    1. PostgreSqlのシリアルシーケンスをEntityFramework(C#)でオーバーライドする

    2. Postgresトリガー機能

    3. PHP / mysql-変数をクラスから個別のindex.phpに渡す方法は?プロフィールページ?

    4. ver.2 PyGreSQLエラー:from _pg import * ImportError:DLLのロードに失敗しました:指定されたモジュールが見つかりませんでした