【问题标题】:Casting org.jooq.TableField<Long> to org.jooq.TableField<BigDecimal>将 org.jooq.TableField<Long> 转换为 org.jooq.TableField<BigDecimal>
【发布时间】:2018-01-31 17:35:28
【问题描述】:

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

在sql中,代码是这样的:

AND   table_nameA.row_name = table_nameB.row_name

在jooq中很简单:

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

我尝试使用

进行投射

Select &lt;? extends Record1&lt;BigDecimal&gt; 但我收到了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

谢谢。

【问题讨论】:

  • 为什么你真的应该做这个演员? TableField&lt;BigDecimal&gt; table_nameA.row_name = TableField&lt;Long&gt; table_nameB.row_name 看起来不像 sql
  • abc.ABC_DEF_PAR_NUMBER 在 Jooq 中的数据类型在 BigDecimal 中定义/生成,而在 Jooq 中的 def.DEF_PAR_NUMBER 数据类型在 Long 中定义/生成。我不被允许。发布真正的实际sql语句,如果我这样做,我会被解雇。
  • 为什么我真的要进行这种铸造?因为jooq以两种不同的数据类型生成了这两个,我不知道为什么。实际 sql 语句中的一个示例是 AND abc.ABC_DEF_PAR_NUMBER = def.DEF_PAR_NUMBER。在 jooq 中应该和 .and(abc.ABC_DEF_PAR_NUMBER.eq(ef.DEF_PAR_NUMBER)) 一样简单。
  • 尝试使用强制 jooq 类型转换器重新生成您的模式 stackoverflow.com/questions/23979524/…

标签: java sql jooq


【解决方案1】:

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

数据类型强制

如果您不关心 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)

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

SQLCAST()

您也可以始终将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>
    

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 2016-07-23
    • 2011-05-01
    • 2013-07-26
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多