任何人都可以告诉我或提供对Oracle数字精度和Java类型之间映射的引用,即在什么时候number(x)映射到short,int,long BigInteger等。
Java的整数类型与Oracle的NUMBER类型不是完美匹配。本质上,有两种方法可以在世界之间进行映射,但都不完美:
NUMBER
NUMBER(3)
Byte
这样可以确保始终可以将SQL值读取为其Java类型。某些Java值可能无法写入SQL类型。
这将确保byte始终可以将Java值写入数据库。但是,某些DB值可能无法读取到Java类型中。
byte
由于以下假设,jOOQ默认为第一个:
在jOOQ 3.8.4中,以下逻辑得以实现DefaultDataType.getNumericClass():
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; }
和:
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
如果在某些情况下(例如)NUMBER(3)用于存储byte数字127,则可以通过在代码生成阶段指定重写数据类型来覆盖此默认值。在此处记录:
127
http://www.jooq.org/doc/latest/manual/code-generation/data-type- rewrites