sql >> Base de Datos >  >> RDS >> Oracle

JOOQ Oracle Number precision y java number mapping

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