如果自增字段不是第一个,jOOQ 可以支持复合主键吗

Can jOOQ support composite primary keys if auto-increment field isn't the first one

我正在使用 jOOQ (3.14.11) 来管理 table 定义(在 H2 或 MYSQL 中)为:

CREATE TABLE example_one (
    group_id VARCHAR(36) NOT NULL, 
    pawn_id INT UNSIGNED AUTO_INCREMENT NOT NULL, 

    some_unimportant_attribute INT UNSIGNED DEFAULT 0 NOT NULL, 
    another_uniportant_attribute VARCHAR(36), 

    CONSTRAINT pk_example_one PRIMARY KEY (group_id, pawn_id)
)

请注意,在这个SQL中,主键按顺序指定(group,pawn)ID,但它是pawn_id,第二个是auto-increment/identity 列。

看来jOOQ不喜欢这种安排。当我尝试使用 Record 对象插入新行时,它不会 return 返回给我“pawnID”值:

 ExampleOneRecord r = create.newRecord(EXAMPLE_ONE);
 r.setGroup("a group identity");
 r.store();

 assert r.getPawnId() != null;  // <---- FAILS test

深入研究代码,嫌疑人似乎是 in AbstractDMLQuery.java method executeReturningGeneratedKeysFetchAdditionalRows,它具有以下逻辑:

            // Some JDBC drivers seem to illegally return null
            // from getGeneratedKeys() sometimes
            if (rs != null)
                while (rs.next())
                    list.add(rs.getObject(1));

rs.getObject(1)的调用似乎假设生成的列将始终是主键的第一列。

有什么办法可以说服 jOOQ 吗?

这是 jOOQ 3.15.1 中 H2 的错误:https://github.com/jOOQ/jOOQ/issues/12192

它已在 H2 2.0.202 的 jOOQ 3.16.0 中修复,现在支持强大的数据更改增量 table 语法,允许更容易地从 DML 语句中获取生成的值(它是在 H2 版本之前实现,但有一个重大错误:https://github.com/h2database/h2database/issues/2502)