java - JOOQ Oracle 数字精度和 Java 数字映射

标签 java sql oracle jooq

任何人都可以告诉我或提供有关 oracle 数字精度和 java 类型之间映射的引用,即数字(x)在什么时候映射到短整型、整型、长整型等

最佳答案

Java 的整数类型与 Oracle 的 NUMBER 类型并不完美匹配。本质上,有两种方法可以在世界之间进行映射,但都不完美:

  • 现状:严格小于 NUMBER(3) -> Byte

    这保证了 SQL 值始终可以读取为其 Java 类型。 某些 Java 值可能无法写入 SQL 类型。

  • 替代方案: 字节 -> NUMBER(3) 或更少。

    这将保证 Java byte 值始终可以写入数据库。不过,某些 DB 值可能无法读取到 Java 类型中。

由于以下假设,jOOQ 默认为第一个:

  • jOOQ 主要用作“数据库优先”API
  • 大部分数据是从DB读取,而不是写入DB

默认行为

在jOOQ 3.8.4中,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,您可以通过以下方式覆盖此默认值在代码生成阶段指定数据类型重写。这记录在此处:

http://www.jooq.org/doc/latest/manual/code-generation/data-type-rewrites

关于java - JOOQ Oracle 数字精度和 Java 数字映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39921053/

相关文章:

oracle - 有没有办法保证 PL/SQL 作业的 DAP?

javascript - Oracle jet 中的登录页面

java - 如果我丢失 session ,我的 JDBC 事务会发生什么情况

java - 在 Android Studio 中找不到符号类 vector

java - 如何从多种可能性中找到负责输出字符串的特定java源文件

java - java 如何显示不带逗号的数字

sql - 查询 GRANTS 授予 postgres 中的序列

java - 在Java中传递动态类对象

sql - Postgres : Getting the highest matching log associated with a record?

mysql - 从三个简单查询创建复杂查询