Tipe integer Java tidak cocok untuk NUMBER
Oracle Oracle jenis. Pada dasarnya, ada dua cara untuk memetakan antara dunia, keduanya tidak sempurna:
-
Status quo: kurang dari
NUMBER(3)
->Byte
.Ini menjamin bahwa nilai SQL selalu dapat dibaca ke tipe Java-nya. Beberapa nilai Java mungkin tidak dapat ditulis ke tipe SQL.
-
Alternatifnya:
Byte
->NUMBER(3)
atau kurang.Ini akan menjamin bahwa Java
byte
nilai selalu dapat ditulis ke database. Namun, beberapa nilai DB mungkin tidak dapat dibaca ke dalam tipe Java.
jOOQ default ke yang pertama, karena asumsi berikut:
- jOOQ sebagian besar digunakan sebagai API "database first"
- sebagian besar data dibaca dari DB, tidak ditulis ke DB
Perilaku default
Di jOOQ 3.8.4, logika berikut diimplementasikan di 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;
}
Dengan:
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
Mengganti default
Jika dalam beberapa kasus Anda menggunakan NUMBER(3)
untuk menyimpan byte
angka hingga 127
misalnya, Anda dapat mengganti default ini dengan menentukan penulisan ulang tipe data selama fase pembuatan kode. Ini didokumentasikan di sini:
http://www.jooq.org/doc /latest/manual/code-generation/data-type-rewrites