我正在尝试使用以下代码来获取自动生成的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()打印为零
答案 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