Java的整数类型与Oracle的
NUMBER类型不是完美匹配。本质上,有两种方法可以在世界之间进行映射,但都不完美:
- 现状: 严格小于
NUMBER(3)
->Byte
。
这样可以确保始终可以将SQL值读取为其Java类型。某些Java值可能无法写入SQL类型。
- 替代方法:
Byte
->NUMBER(3)
或更少。
这将确保
byte始终可以将Java值写入数据库。但是,某些DB值可能无法读取到Java类型中。
由于以下假设,jOOQ默认为第一个:
- jOOQ通常用作“数据库优先” API
- 大多数数据是从数据库读取的,而不是写入数据库的
默认行为
在jOOQ
3.8.4中,以下逻辑得以实现
DefaultDataType.getNumericClass():
// Integersif (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-integerselse { return BigDecimal.class;}和:
int LONG_PRECISION = String.valueOf(Long.MAX_VALUE).length(); // 19int INTEGER_PRECISION = String.valueOf(Integer.MAX_VALUE).length(); // 10int SHORT_PRECISION = String.valueOf(Short.MAX_VALUE).length(); // 5int BYTE_PRECISION = String.valueOf(Byte.MAX_VALUE).length(); // 3
覆盖默认
如果在某些情况下(例如)
NUMBER(3)用于存储
byte数字
127,则可以通过在代码生成阶段指定重写数据类型来覆盖此默认值。在此处记录:
http://www.jooq.org/doc/latest/manual/pre-generation/data-type-
rewrites



