Os tipos inteiros do Java não são uma combinação perfeita para o
NUMBER
do Oracle tipos. Essencialmente, existem duas maneiras de mapear entre os mundos, ambas imperfeitas:-
O status quo: estritamente menor queNUMBER(3)
->Byte
.
Isso garante que um valor SQL sempre possa ser lido em seu tipo Java. Alguns valores Java podem não ser graváveis no tipo SQL.
-
A alternativa:Byte
->NUMBER(3)
ou menos.
Isso garantirá que um Javabyte
valor sempre pode ser gravado no banco de dados. No entanto, alguns valores de banco de dados podem não ser legíveis no tipo Java.
O padrão do jOOQ é o primeiro, devido às seguintes suposições:
- jOOQ é usado principalmente como uma API "primeiro banco de dados"
- a maioria dos dados é lida do banco de dados, não gravada no banco de dados
O comportamento padrão
No jOOQ 3.8.4, a seguinte lógica é implementada em
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;
}
Com:
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
Substituindo o padrão
Se em alguns casos você usar
NUMBER(3)
para armazenar byte
números até 127
por exemplo, você pode substituir esse padrão especificando a reescrita do tipo de dados durante a fase de geração de código. Isso está documentado aqui:http://www.jooq.org/doc /latest/manual/code-generation/data-type-rewrites