【发布时间】:2019-04-13 09:56:33
【问题描述】:
这是一个奇怪的问题,在 JOOQ 的 3.10 和 3.11 版本中不断发生(没有尝试过早期版本)。我使用fetchInto 获取记录,当我打印记录(或进行调试)时,所有字段都正确打印。也就是说 field_x 的值是正确的。
问题是,当我使用记录的getX 方法检索field_x 时,它会从另一个字段返回值。
以下是我们使用的一些代码。
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 已填充。但是当我使用getFirstName 方法打印first_name 时,我得到NULL。
cur.getFirstName() = null
看起来好像字段的索引号不匹配....生成的代码认为firstName是字段6,在这种情况下,但实际上它是字段8(第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 |...
+------+-------+-------+...
Link to the JOOQ generated code.
你能发布表格的 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
;
您使用的是什么数据库产品和版本?
在上述情况下,我在 AWS RDS 上使用 MySQL 5.7.23。对于第一个示例,它是 AWS RDS 上 MySQL 5.6 的变体。另外,对于后一个例子,它发生在 5.7.14-google 上,我们最近迁移到 AWS。
【问题讨论】:
-
生成的记录和生成的表是否不匹配? IE。记录引用的列是否与表一样多?
-
记录有44个字段,表格有44列。这个周末我在一个单独的项目中也有这个,但在这种情况下,使用 DslContext 创建一个新记录,并使用 setFieldName 方法分配值。当我尝试存储记录时,列未与字段对齐。为了解决这个问题,我改用 set(FIELD, value) 方法来设置记录的值。
-
听起来像是代码生成器中一个非常奇怪的边缘案例错误。这怎么能被复制?您可以发布表格的DDL吗?您使用的是什么数据库产品和版本?
-
@LukasEder 添加了更多信息。