Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

JOOQ Oracle Number precisão e mapeamento de número java


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 que NUMBER(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 Java byte 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