在JOOQ中插入MySQL的返回查询

时间:2015-07-07 04:01:18

标签: java mysql java-ee jooq

我正在尝试使用以下代码来获取自动生成的ID。我的后端是MySQL。代码看起来像这样

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());

我收到了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并尝试了

{{1}}

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

3 个答案:

答案 0 :(得分:2)

我知道我参加晚会很晚。 但我希望我可以帮助有类似问题的人,

  

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

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

P / s:我使用MySQL

答案 1 :(得分:0)

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

另外我认为在MySQL的情况下IDENTITY不是由AUTO_INCREMENT而是PRIMARY KEY(...) Demo

答案 2 :(得分:0)

刚刚测试插入记录并从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