【问题标题】:jOOQ code generation: forcedTypejOOQ 代码生成:forcedType
【发布时间】:2014-09-09 12:58:47
【问题描述】:

我目前正在评估 jOOQ。我们在创建连接语句时遇到问题,如下所示:

create.select( )
        .from( TABLEA, TABLEB)
        .where(TABLEA.ID.equal( TABLEB.TABLEA_ID ));

因为类型不匹配。在(Oracle 11g)数据库中,TABLEA 是 NUMBER(22,0),但 TABLEB.TABLEA_ID 是 NUMBER(7,0)

因此 jOOQ 为第一个属性生成一个 BigInteger 字段,但为后者生成一个 Integer 字段。

所以我尝试使用以下 xml 生成所有 NUMBER(.*,0)BigInteger

    <forcedTypes>
        <forcedType>
          <name>DECIMAL_INTEGER</name>
          <expression>.*</expression>
          <types>NUMBER(.*,0)</types>
        </forcedType>
    </forcedTypes>

</database>

但这不起作用。我仍然有以Integer 为类型的字段。那么,除了更改表格列类型之外,我还能做些什么呢?

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    不幸的是,#2485 还没有在 jOOQ 3.4 中实现,所以你还不能匹配长度、精度和比例。我意识到手册似乎另有说明,这是错误的......

    如果这种情况只是偶尔发生,您还可以通过 jOOQ API 来处理数据类型。以下是一些选项:

    // This will render an actual cast in the generated SQL statement
    TABLEA.ID.equal( TABLEB.TABLEA_ID.cast(TABLEA.ID.getDataType()) )
    TABLEA.ID.equal( TABLEB.TABLEA_ID.cast(BigInteger.class) )
    
    // This generate a new column TABLEA_ID of type NUMBER(22, 0)
    TABLEA.ID.equal( TABLEB.TABLEA_ID.coerce(TABLEA.ID.getDataType()) )
    TABLEA.ID.equal( TABLEB.TABLEA_ID.coerce(BigInteger.class) )
    
    // This is your last resort: raw types
    TABLEA.ID.equal( (Field) TABLEB.TABLEA_ID )
    

    【讨论】:

    • 不幸的是,您的正则表达式也不起作用。它适用于NUMBER,但随后它也将BigInteger 用于具有比例的NUMBER 类型。
    • @Angelo.Hannes:对不起,我很抱歉造成混乱。 #2485 尚未在 jOOQ 3.4 中实现,这就是它不起作用的原因。该手册是错误的......我想你将不得不诉诸上述显式转换之一,或者编写一个匹配数据库中所有相关列的正则表达式 - 例如所有以_ID结尾的列?
    • 非常感谢。我将尝试其中一种解决方法。
    猜你喜欢
    • 2017-12-03
    • 2017-08-13
    • 2020-01-23
    • 2014-03-06
    • 2016-06-12
    • 2020-12-23
    • 2016-11-22
    • 2020-07-26
    • 2015-12-13
    相关资源
    最近更新 更多