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