代码之家  ›  专栏  ›  技术社区  ›  Jose Martinez

获取时JOOQ记录中的字段未对齐

  •  1
  • Jose Martinez  · 技术社区  · 7 年前

    这是一个奇怪的问题,在JOOQ的3.10和3.11版本中不断发生(没有尝试早期版本)。我使用 fetchInto

    问题是,当我使用记录的 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 人口众多。但是当我打印 名字 使用 getFirstName NULL .

    cur.getFirstName() = null
    

    从外观上看,字段的索引号似乎不匹配。。。。生成的代码认为 firstName 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。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Lukas Eder    7 年前

    看起来您发布的生成记录是手动修改的,或者是使用一些后期处理程序修改的,或者是由自定义生成器生成的。显然,生成的表(正确的顺序):

    public class Transactions extends TableImpl<TransactionsRecord> {
    
        ...
    
        public final TableField<TransactionsRecord, BigDecimal> AMOUNT = 
          createField("amount", org.jooq.impl.SQLDataType.DECIMAL(42, 10).nullable(false), this, "");
    
        public final TableField<TransactionsRecord, String> ACCOUNT = 
          createField("account", org.jooq.impl.SQLDataType.VARCHAR(50).nullable(false), this, "");
    
        public final TableField<TransactionsRecord, String> ADDRESS = 
          createField("address", org.jooq.impl.SQLDataType.VARCHAR(50).nullable(false), this, "");
    
        ...
    

    ... 以及生成的记录:

    public class TransactionsRecord extends UpdatableRecordImpl<TransactionsRecord> 
        implements Record20<...> {
    
        public void setAccount(String value) {
            set(0, value);
        }
    
        public String getAccount() {
            return (String) get(0);
        }
    
        public void setAddress(String value) {
            set(1, value);
        }
    
        public TransactionsRecord() {
            super(Transactions.TRANSACTIONS);
        }
    
        public TransactionsRecord(String account, String address, BigDecimal amount, ...) {
            super(Transactions.TRANSACTIONS);
    
            set(0, account);
            set(1, address);
            set(2, amount);
            ...
        }
    
        public BigDecimal getAmount() {
            return (BigDecimal) get(2);
        }
    
        public String getAddress() {
            return (String) get(1);
        }
    
        public void setAmount(BigDecimal value) {
            set(2, value);
        }
    
        public void setBlockhash(String value) {
            set(4, value);
        }
    
        ...
    

    在构造函数之后。而且,它们也不正常!官员 JavaGenerator

    注意,如果您确实想修改生成的代码,您应该 JavaGenerator 实现您自己的类或生成器。

        2
  •  2
  •   Jose Martinez    7 年前

    在做了一些测试之后,它看起来像 Rearrange code 重新排列代码 功能在提交更改窗口中显示为一个选项。

    enter image description here

    测试包括在测试之前和之后运行测试 重新排列代码 特色。下面是代码。

        TransactionsRecord tr = serviceDslContext.newRecord(TRANSACTIONS);
        tr.setAmount(new BigDecimal(10));
        logger.debug("tr = {}", tr);
    

    如果此代码在

     +-------+-------+------+...
    |account|address|amount|...
    +-------+-------+------+...
    |{null} |{null} |   *10|...
    +-------+-------+------+...
    

    IntelliJ执行后 重新排列代码

    +------+-------+-------+...
    |amount|account|address|...
    +------+-------+-------+...
    |{null}|{null} |*10    |...
    +------+-------+-------+...
    

    看起来这些值保持在正确的位置,但是这些值所代表的字段已经发生了变化。