将org.jooq.TableField <long>转换为org.jooq.TableField <bigdecimal>

时间:2017-08-23 08:26:10

标签: 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

感谢。

1 个答案:

答案 0 :(得分:0)

有几种方法可以解决此数据类型不匹配问题。

数据类型强制

如果您不关心jOOQ针对不同的NUMBER / DECIMAL / NUMERIC精度和比例生成的不同数据类型,那么您可以使用{{1} },有三种重载的风格:

在你的情况下,后者可能效果最好:

DataType

强制不会影响生成的SQL,只会强制table_nameA.row_name.eq(table_nameB.row_name.coerce(table_nameA.row_name)) 引用属于某个Field

原始类型铸造

穷人替代强迫可能是原型:

DataType

这通常不推荐,但作为最后的手段仍然值得一提。

SQL 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) )是错误生成的,您可以:

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

    BIGINT