JOOQ принудил типы преобразовать BigInteger в BigDecimal для POSTGRES

#java #sql #jooq

Вопрос:

для таблицы , скажем, myTable, у меня есть столбец MyColumn..

поколение JOOQ по умолчанию создает столбец MyColumn как BigInteger,

Я хочу создать его как BigDecimal.

Это конвертер, который я использую.

 public class myConverter extends AbstractConverter<BigInteger, BigDecimal> {

    public BigIntToBigDecConverter(Class<BigInteger> fromType, Class<BigDecimal> toType) {

        super(fromType, toType);
    }

    @Override
    public BigDecimal from(BigInteger databaseObject) {
        return new BigDecimal(databaseObject);
    }

    @Override
    public BigInteger to(BigDecimal userObject) {
        return new BigInteger(String.valueOf(userObject.intValue()));
    }
}
 

Как должна выглядеть конфигурация типа силы в XML-файле?

Комментарии:

1. Что вы пробовали отсюда ? Почему это не сработало?

2. @LukasEder Я попробовал это « <Принудительные типы> <Принудительные типы><Принудительный тип> <Принудительный тип><Тип пользователя>java.math.BigDecimal<Тип пользователя></Тип пользователя> </Тип пользователя><конвертер>xyz.myclass. BigIntToBigDecConverter</конвертер> </конвертер><типы>BigInteger.*<типы></типы> </типы><includeExpression>*<includeExpression></includeExpression> </includeExpression></forcedType> </forcedType></forcedTypes> ` в журналах не отображаются какие-либо конкретные ошибки.

3. Вы можете отредактировать свой вопрос, чтобы добавить более подробную информацию…

Ответ №1:

Причина, по которой ваши столбцы генерируются как BigInteger , заключается в том, что они NUMERIC(n, 0) имеют тип NUMBER(n, 0) , или DECIMAL(n, 0) в зависимости от используемого вами диалекта, но ключевым моментом здесь является то, что масштаб 0 n достаточно велик, чтобы он больше не вписывался Long .

Причина , по которой ваша <forcedType/> конфигурация не сработала , заключается в том, что указанный вами тип <types/> является типом Java BigInteger , а не SQLDataType , см. Документацию здесь. Чтобы переписать все десятичные дроби нулевой шкалы для получения BigDecimal , просто напишите это:

 <forcedType>
  <name>NUMERIC</name>
  <inputTypes>(?i:(NUMERIC|NUMBER|DECIMAL)(d ,0))</inputTypes>
</forcedType>
 

Для этого вам не понадобится конвертер custome

Комментарии:

1. Что делать, если я хочу сделать это для одного столбца определенной таблицы

2. Затем просто добавьте обычное <includeExpression> регулярное выражение в <forcedType>