【问题标题】:Insert Returning Query For MySQL in JOOQ在 JOOQ 中为 MySQL 插入返回查询
【发布时间】:2015-07-07 04:01:17
【问题描述】:

我正在尝试使用以下代码来获取自动生成的 id 。我的后端是 MySQL。代码如下所示

Record record = create.insertInto(CANDIDATE, CANDIDATE.FIRST_NAME,      
       CANDIDATE.LAST_NAME,CANDIDATE.EXTRACTED_NAME)
       .values("Charlotte", "Roche","Charlotte Roche")
       .returning(CANDIDATE.ID)
       .fetchOne();

System.out.println(record.getValue(CANDIDATE.ID));

我收到 NullPointerException。我看了一下http://www.jooq.org/javadoc/latest/org/jooq/InsertReturningStep.html。 它说

Derby、H2、Ingres、MySQL、 SQL Server 仅允许将 IDENTITY 列值检索为“生成的键”。如果请求其他字段,则发出第二条语句。客户端代码必须确保两个语句之间的事务完整性。

根据我对 Mysql auto_increment 的理解,它可以作为 IDENTITY。任何人都可以说明如何为 MySQL

实现这一目标

我查看了这个SO Question on a similar topic 并尝试关注

Result<?>  record =
            create.insertInto(CANDIDATE, CANDIDATE.FIRST_NAME, CANDIDATE.LAST_NAME,CANDIDATE.EXTRACTED_NAME)
                  .values("Charlotte", "Roche","Charlotte Roche")
                  .returning(CANDIDATE.ID)
                  .fetch();

            System.out.println(record.size());

虽然它在后端插入记录,但将 record.size() 打印为零

【问题讨论】:

  • 你能发布你得到的NullPointerException吗?您能否也发布您的CANDIDATE 表的 DDL?
  • 备案,这个问题也被举报为#4400

标签: java mysql jakarta-ee jooq


【解决方案1】:

我知道我参加聚会要迟到了。 但我希望我能帮助有类似问题的人,

Derby、H2、Ingres、MySQL、SQL Server 仅允许将 IDENTITY 列值检索为“生成的键”。如果请求其他字段,则发出第二条语句。客户端代码必须确保两个语句之间的事务完整性。

"generated key" 是问题所在。 您可以使用SHOW CREATE TABLE $table_name 检查您的表ID 是否为AUTO_INCREMENT。我认为不是。

P/s:我正在使用 MySQL

【讨论】:

    【解决方案2】:

    刚刚做了一个测试,插入一条记录并从 Spring 服务中检索生成的 id,没有任何问题。

    是的,MySQL 中的 auto_increment 与 jOOQ 一起作为 IDENTITY。

    MySQL 表如下所示:

    CREATE TABLE persons (
        `id` mediumint(9) NOT NULL AUTO_INCREMENT,
        `first_name` varchar(64) NOT NULL,
        `last_name` varchar(64) NOT NULL,
        primary key(id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    还有这样的服务:

    public Result<PersonsRecord> insertPerson(String firstName, String lastName) {
        Result<PersonsRecord> result =
            dsl
                .insertInto(
                        PERSONS,
                        PERSONS.FIRST_NAME,
                        PERSONS.LAST_NAME)
                .values(
                        firstName,
                        lastName)
                .returning(PERSONS.ID)
                .fetch();
        logger.debug("Person ID: " + result.getValue(0, PERSONS.ID));
        return result;
    }
    

    执行插入后生成的id立即可用:

    Person ID: 4 
    

    【讨论】:

      【解决方案3】:

      也许交易有问题。 Insert 可能尚未将这些值保留在数据库中,因此不会获取任何内容。

      另外我认为 MySQL 的 IDENTITY 不是由 AUTO_INCREMENT 而是 PRIMARY KEY (...) https://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

      【讨论】:

        猜你喜欢
        • 2011-12-28
        • 2017-03-03
        • 1970-01-01
        • 1970-01-01
        • 2019-03-26
        • 2022-01-26
        • 1970-01-01
        • 2015-11-30
        • 2022-01-22
        相关资源
        最近更新 更多