Các kiểu số nguyên của Java không phải là đối sánh hoàn hảo với NUMBER
của Oracle các loại. Về cơ bản, có hai cách để lập bản đồ giữa các thế giới, cả hai đều không hoàn hảo:
-
Hiện trạng: nhỏ hơn
NUMBER(3)
->Byte
.Điều này đảm bảo rằng một giá trị SQL luôn có thể được đọc cho kiểu Java của nó. Một số giá trị Java có thể không ghi được vào kiểu SQL.
-
Giải pháp thay thế:
Byte
->NUMBER(3)
hoặc ít hơn.Điều này sẽ đảm bảo rằng một Java
byte
giá trị luôn có thể được ghi vào cơ sở dữ liệu. Tuy nhiên, một số giá trị DB có thể không đọc được trong kiểu Java.
jOOQ mặc định là cái đầu tiên, vì các giả định sau:
- jOOQ chủ yếu được sử dụng làm API "đầu tiên cho cơ sở dữ liệu"
- hầu hết dữ liệu được đọc từ DB, không được ghi vào DB
Hành vi mặc định
Trong jOOQ 3.8.4, logic sau được triển khai trong 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;
}
Với:
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
Ghi đè giá trị mặc định
Nếu trong một số trường hợp, bạn sử dụng NUMBER(3)
để lưu trữ byte
số lên đến 127
chẳng hạn, bạn có thể ghi đè mặc định này bằng cách chỉ định ghi lại kiểu dữ liệu trong giai đoạn tạo mã. Điều này được ghi lại ở đây:
http://www.jooq.org/doc / mới nhất / thủ công / tạo mã / dữ liệu-loại-viết lại