Это странная проблема, которая постоянно возникает в версиях 3.10 и 3.11 JOOQ (не пробовала более ранние версии). Я выбираю запись, используя fetchInto
, и когда я печатаю запись (или выполняю отладку), все поля печатаются правильно. То есть значение для field_x является правильным.
Проблема в том, что когда я иду к извлечению field_x с использованием метода getX
записи, он возвращает значение из другого поля.
Ниже приведен код, который мы использовали.
return jooqDslContext.select(CL_USERS.fields())
.from(CL_USERS)
.join(THIRDPARTY_USER_XREF)
.on(THIRDPARTY_USER_XREF.USER_ID.eq(CL_USERS.CL_USER_ID))
.join(THIRDPARTY_USER_ID)
.on(THIRDPARTY_USER_ID.ID.eq(THIRDPARTY_USER_XREF.THIRDPARTY_ID))
.where(THIRDPARTY_USER_ID.EID.eq(eid))
.fetchOptionalInto(CL_USERS);
Вот распечатка записи ...
+--------------------------------------------------+----------+------+-----------+------------------+------------+----------------+------------------------+ etc...
|remember_token |cl_user_id|ria_id|ria_user_id|ria_user_id_backup|cl_user_type|user_description|first_name | etc...
+--------------------------------------------------+----------+------+-----------+------------------+------------+----------------+------------------------+ etc...
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...| 777777777| 777| 77777| {null}| {null}|{null} |xxxxxxxxxxxxxxxxxxxxxxxx| etc...
+--------------------------------------------------+----------+------+-----------+------------------+------------+----------------+------------------------
обратите внимание, что first_name
заполнен. но когда я печатаю first_name
с использованием метода getFirstName
, я получаю NULL
.
cur.getFirstName() = null
Судя по всему, существует несоответствие между порядковым номером поля .... сгенерированный код считает, что firstName
- это поле 6, в данном случае, но на самом деле это поле 8 (восьмое поле на выходе toString()
.
public byte[] getFirstName() {
return (byte[]) get(6);
}
РЕДАКТИРОВАТЬ: Добавление дополнительной информации.
Как это можно воспроизвести?
Вот еще один пример, использующий кодовую базу, отличную от приведенной выше. В этом случае я установил поле amount
на объекте записи. Но когда я иду сохранить или распечатать, вместо этого устанавливается поле address
.
TransactionsRecord tr = serviceDslContext.newRecord(Transactions.TRANSACTIONS);
tr.setAmount(new BigDecimal(10));
logger.debug("tr = {}", tr);
печать ..
+------+-------+-------+...
|amount|account|address|...
+------+-------+-------+...
|{null}|{null} |*10 |...
+------+-------+-------+...
Ссылка на сгенерированный код JOOQ.
Можете ли вы опубликовать DDL таблицы?
CREATE TABLE `transactions` (
`account` VARCHAR(50) NOT NULL,
`address` VARCHAR(50) NOT NULL,
`amount` DECIMAL(42,10) NOT NULL,
`bip125-replaceable` VARCHAR(64) NOT NULL,
`blockhash` VARCHAR(64) NOT NULL,
`blockindex` INT(11) NOT NULL,
`blocktime` TIMESTAMP NULL DEFAULT NULL,
`category` VARCHAR(50) NOT NULL,
`confirmation` INT(11) NOT NULL,
`generated` TINYINT(1) NOT NULL,
`instantlock` TINYINT(4) NOT NULL,
`involvesWatchonly` TINYINT(4) NOT NULL,
`label` VARCHAR(50) NOT NULL,
`time` TIMESTAMP NULL DEFAULT NULL,
`timereceived` TIMESTAMP NULL DEFAULT NULL,
`txid` VARCHAR(64) NOT NULL,
`vout` INT(11) NOT NULL,
`walletconflicts` TEXT NULL,
`amount_in_usd` DECIMAL(42,10) NULL DEFAULT NULL,
`usd_exchange_rate` DECIMAL(42,10) NULL DEFAULT NULL,
PRIMARY KEY (`txid`),
INDEX `account_generated` (`account`, `generated`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
Какой продукт и версию базы данных вы используете?
В вышеупомянутом случае я использую MySQL 5.7.23 на AWS RDS. Для первого примера это был вариант MySQL 5.6 на AWS RDS. Кроме того, в последнем примере это произошло на 5.7.14-google, мы недавно перешли на AWS.