我想知道是否有人可以帮助我将表对象类型从 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()
,它有三种重载的风格:
-
Field.coerce(Class)
(将类型强制为 Java 类) -
Field.coerce(DataType)
(将类型强制为DataType
(包括其数据类型绑定(bind))) -
Field.coerce(Field)
(将类型强制为另一个字段的DataType
)
就您而言,后者可能效果最好:
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
)是错误生成的,您可以:
- 修复您的数据库架构并向生成
BigDecimal
的列添加一些精度/小数位数(在 Oracle 中),或者将其设为BIGINT
(在其他数据库中) 使用 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/