gpt4 book ai didi

java - 将 org.jooq.TableField 转换为 org.jooq.TableField

转载 作者:行者123 更新时间:2023-12-02 12:20:18 26 4
gpt4 key购买 nike

我想知道是否有人可以帮助我将表对象类型从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com