我想知道是否有人可以帮助我将表格对象类型从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
。
感谢。
答案 0 :(得分:0)
有几种方法可以解决此数据类型不匹配问题。
如果您不关心jOOQ针对不同的NUMBER
/ DECIMAL
/ NUMERIC
精度和比例生成的不同数据类型,那么您可以使用{{1} },有三种重载的风格:
Field.coerce(Class)
(将类型强制转换为Java类)Field.coerce(DataType)
(将类型强制转换为Field.coerce()
(包括其数据类型绑定))Field.coerce(Field)
(将类型强制转换为另一个字段的DataType
)在你的情况下,后者可能效果最好:
DataType
强制不会影响生成的SQL,只会强制table_nameA.row_name.eq(table_nameB.row_name.coerce(table_nameA.row_name))
引用属于某个Field
。
穷人替代强迫可能是原型:
DataType
这通常不推荐,但作为最后的手段仍然值得一提。
table_nameA.row_name.eq((Field) table_nameB.row_name)
您也可以随时将CAST()
转换为SQL中的特定数据类型。如果您的数据类型具有不同的比例并且您希望比例匹配,则此功能非常有用,例如:因为您想要处理Field
甚至1.0001 = 1.0
。
还有三种'1' = 1
:
在你的情况下:
Field.cast()
这不同于强制生成的SQL将包含table_nameA.row_name.eq(table_nameB.row_name.cast(table_nameA.row_name))
(这可能会对性能产生负面影响,当然,因为普通索引不能用于CAST()
表达式)
生成的SQL看起来像这样:
CAST
如果您认为生成的任何类型(例如TABLE_NAMEA.ROW_NAME = CAST(TABLE_NAMEB.ROW_NAME AS BIGINT)
)是错误生成的,您可以:
Long
的列(在Oracle中)添加一些精度/比例,或将其设为BigDecimal
(在其他数据库中)重新生成您的架构,并为该列启用data type rewriting feature,例如
BIGINT