Los tipos enteros de Java no son una combinación perfecta para el NUMBER
de Oracle tipos Esencialmente, hay dos formas de mapear entre los mundos, ambas imperfectas:
-
El statu quo: estrictamente menor que
NUMBER(3)
->Byte
.Esto garantiza que un valor SQL siempre se pueda leer en su tipo Java. Es posible que algunos valores Java no se puedan escribir en el tipo SQL.
-
La alternativa:
Byte
->NUMBER(3)
o menos.Esto garantizará que un Java
byte
El valor siempre se puede escribir en la base de datos. Sin embargo, es posible que algunos valores de base de datos no se puedan leer en el tipo Java.
jOOQ por defecto es el primero, debido a las siguientes suposiciones:
- jOOQ se usa principalmente como una API de "base de datos primero"
- la mayoría de los datos se leen de la base de datos, no se escriben en la base de datos
El comportamiento predeterminado
En jOOQ 3.8.4, la siguiente lógica se implementa en 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;
}
Con:
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
Anular el valor predeterminado
Si en algunos casos usa NUMBER(3)
almacenar byte
números hasta 127
por ejemplo, puede anular este valor predeterminado especificando la reescritura del tipo de datos durante la fase de generación de código. Esto está documentado aquí:
http://www.jooq.org/doc /último/manual/generación-de-código/reescrituras-tipo-datos