Генерация кода jOOQ: forceType

Сейчас я оцениваю 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.

Итак, я попытался сгенерировать все NUMBER(.*,0) с BigInteger со следующим xml:

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

</database>

Но это не сработало. У меня все еще есть поля с типом Integer. Итак, что я могу с этим поделать, кроме изменения типа столбца таблицы?


person Angelo.Hannes    schedule 18.07.2014    source источник


Ответы (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 )
person Lukas Eder    schedule 18.07.2014
comment
к сожалению, ваше регулярное выражение тоже не сработало. Он работал для NUMBER, но тогда он также будет использовать BigInteger для NUMBER типов с масштабом. - person Angelo.Hannes; 18.07.2014
comment
@ Анджело.Ханнес: Мне плохо, извини за путаницу. # 2485 еще не реализован в jOOQ 3.4, поэтому он не работает . Руководство неверно ... Я думаю, вам придется прибегнуть к одному из указанных выше явных преобразований или написать регулярное выражение, соответствующее всем соответствующим столбцам в вашей базе данных - например, все столбцы заканчиваются на _ID? - person Lukas Eder; 18.07.2014
comment
Большое тебе спасибо. Я попробую один из обходных путей. - person Angelo.Hannes; 18.07.2014