Oracle
 sql >> Base de données >  >> RDS >> Oracle

JOOQ Oracle Number precision et java number mapping

Les types entiers de Java ne correspondent pas parfaitement au NUMBER d'Oracle les types. Essentiellement, il existe deux façons de mapper les mondes, toutes deux imparfaites :

  • Le statu quo : strictement inférieur à NUMBER(3) -> Byte .

    Cela garantit qu'une valeur SQL peut toujours être lue dans son type Java. Certaines valeurs Java peuvent ne pas être accessibles en écriture dans le type SQL.

  • L'alternative : Byte -> NUMBER(3) ou moins.

    Cela garantira qu'un Byte Java La valeur peut toujours être écrite dans la base de données. Cependant, certaines valeurs de base de données peuvent ne pas être lisibles dans le type Java.

jOOQ utilise par défaut le premier, en raison des hypothèses suivantes :

  • jOOQ est principalement utilisé comme une API "base de données d'abord"
  • la plupart des données sont lues à partir de la base de données, et non écrites dans la base de données

Le comportement par défaut

Dans jOOQ 3.8.4, la logique suivante est implémentée dans 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;
}

Avec :

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

Remplacer la valeur par défaut

Si dans certains cas vous utilisez NUMBER(3) pour stocker Byte nombres jusqu'à 127 par exemple, vous pouvez remplacer cette valeur par défaut en spécifiant la réécriture du type de données lors de la phase de génération de code. Ceci est documenté ici :

http://www.jooq.org/doc /dernier/manuel/code-generation/data-type-rewrites