Celočíselné typy Java se dokonale neshodují s NUMBER
Oracle typy. V podstatě existují dva způsoby mapování mezi světy, oba jsou nedokonalé:
-
Současný stav: striktně menší než
NUMBER(3)
->Byte
.To zaručuje, že hodnotu SQL lze vždy číst do jejího typu Java. Některé hodnoty Java nemusí být zapisovatelné do typu SQL.
-
Alternativa:
Byte
->NUMBER(3)
nebo méně.To zaručí, že
byte
Java hodnotu lze vždy zapsat do databáze. Některé hodnoty DB však nemusí být čitelné do typu Java.
jOOQ se nastaví na první z následujících předpokladů:
- jOOQ se většinou používá jako „database first“ API
- většina dat je čtena z DB, nikoli zapisována do DB
Výchozí chování
V jOOQ 3.8.4 je následující logika implementována v 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;
}
S:
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
Přepsání výchozího nastavení
Pokud v některých případech použijete NUMBER(3)
pro uložení byte
čísla do 127
toto výchozí nastavení můžete například přepsat zadáním přepisování datového typu během fáze generování kódu. Toto je zdokumentováno zde:
http://www.jooq.org/doc /latest/manual/code-generation/data-type-rewrites