java - 将 org.jooq.TableField<Long> 转换为 org.jooq.TableField<BigDecimal>

标签 java sql jooq

我想知道是否有人可以帮助我将表对象类型从 Long 转换为 BigDecimal?

在sql中,代码是这样的:

AND   table_nameA.row_name = table_nameB.row_name

在 jooq 中很简单:

and(table_nameA.row_name.eq( table_nameB.row_name))

我尝试用

来转换它

Select <? extends Record1<BigDecimal>但我收到了ClassCastException org.jooq.immpl.TableFieldImpl cannot be cast to org.jooq.Select .

当我尝试使用 (BigDecimal) 来转换它时,我收到了ClassCastException org.jooq.immpl.TableFieldImpl cannot be cast to java.math.BigDecimal .

谢谢。

最佳答案

有多种方法可以解决这种数据类型不匹配的问题。

数据类型强制

如果你不关心jOOQ针对不同的情况生成的不同数据类型NUMBER/DECIMAL/NUMERIC精度和比例,那么你可以使用 Field.coerce() ,它有三种重载的风格:

就您而言,后者可能效果最好:

table_nameA.row_name.eq(table_nameB.row_name.coerce(table_nameA.row_name))

强制不会影响生成的 SQL,它只是强制 Field引用某个DataType .

原始类型类型转换

穷人替代强制的方法可能是原始类型转换:

table_nameA.row_name.eq((Field) table_nameB.row_name)

通常不建议这样做,但作为最后的手段仍然值得一提。

SQL CAST()

您随时可以转换 Field也适用于 SQL 中的特定数据类型。如果您的数据类型具有不同的比例并且您希望比例匹配,例如,这非常有用。因为你想治疗1.0001 = 1.0甚至 '1' = 1 .

Field.cast()又分为三种口味:

就您而言:

table_nameA.row_name.eq(table_nameB.row_name.cast(table_nameA.row_name))

这与强制不同,生成的 SQL 将包含 CAST() (当然,这可能会对性能产生负面影响,因为普通索引不能在 CAST 表达式上使用)

生成的 SQL 看起来像这样:

TABLE_NAMEA.ROW_NAME = CAST(TABLE_NAMEB.ROW_NAME AS BIGINT)

以不同的方式生成代码

如果您认为任一生成类型(例如 Long )是错误生成的,您可以:

  1. 修复您的数据库架构并向生成 BigDecimal 的列添加一些精度/小数位数(在 Oracle 中),或者将其设为 BIGINT (在其他数据库中)
  2. 使用 data type rewriting feature 重新生成您的架构为该列打开,例如

    <forcedType>
      <name>BIGINT</name>
      <expression>(?i:.*?\.TABLE_NAMEB\.ROW_NAME)</expression>
    </forcedType>
    

关于java - 将 org.jooq.TableField<Long> 转换为 org.jooq.TableField<BigDecimal>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45834455/

相关文章:

java - 如何检测大型音频文件(5 分钟)中的已知声音(约 10 秒的短音频)

java - 如何消除因循环从网络摄像头下载图像而导致的 GC_FOR_ALLOC 消息

sql - 如何在 INSERT 中构建 "if-else"SQL 查询?

mysql - 在一个查询中对一个表中的不同值求和

php - 具有多个条件的 SQL 更新

java - 在 JOOQ 分页之前获取总行数?

java - "NoSuchFieldError: qTESLA_I"与 JcaContentSignerBuilder

postgresql - 如何在 JOOQ 中为 PostgreSQL 编写正确的 bool 比较

mysql - 如何使用 Gradle 和 Mysql 为单个数据库配置 jooq

java - Gradle Wrapper ClassNotFound 但只是有时?