如何在不指定任何值的情况下插入记录并仅返回新创建的 ID?如果我这样做:
private Long createOffer() {
return this.ctx.insertInto(StoreOffer.STORE_OFFER, StoreOffer.Store_OFFER.ID)
.returning(StoreOffer.STORE_OFFER.ID)
.fetchOne().getValue(StoreOffer.STORE_OFFER.ID);
}
我收到一个java.lang.NullPointerException
。如果我只是将其设置为 null
,Not-Null-Constraint 就会被触发..
private Long createOffer() {
return this.ctx.insertInto(StoreOffer.STORE_OFFER, StoreOffer.Store_OFFER.ID)
.values((Long)null)
.returning(StoreOffer.STORE_OFFER.ID)
.fetchOne().getValue(StoreOffer.STORE_OFFER.ID);
}
我也尝试过这个:
private Long createOffer() {
StoreOfferRecord storeOfferRecord = this.ctx.newRecord(StoreOffer.STORE_OFFER);
storeOfferRecord.store();
return storeOfferRecord.getId();
}
但 ID 始终为 null
。
表store_offer
目前看起来像这样:
CREATE TABLE store_offer (
-- PRIMARY KEY
id BIGSERIAL PRIMARY KEY
);
最佳答案
使用插入..默认值
对于此用例,jOOQ 支持 INSERT
语句上的 SQL 标准 DEFAULT VALUES
子句:
return this.ctx.insertInto(StoreOffer.STORE_OFFER)
.defaultValues()
.returning(StoreOffer.STORE_OFFER.ID)
.fetchOne().getValue(StoreOffer.STORE_OFFER.ID);
为什么会出现NullPointerException
您可以编写以下查询 because of an API flaw (#3771) 。以下内容甚至不应该编译:
return this.ctx.insertInto(StoreOffer.STORE_OFFER, StoreOffer.Store_OFFER.ID)
.returning(StoreOffer.STORE_OFFER.ID)
.fetchOne().getValue(StoreOffer.STORE_OFFER.ID);
为什么 record.store()
不起作用:
jOOQ 记录有一个内部每列更改标志。没有记录级更改标志表明即使没有任何更改,也需要将整个记录发送到数据库。具体来说,如果需要发出 UPDATE
语句,则这没有任何意义。
关于java - 如何在不设置值的情况下insertInto()并返回新创建的ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34621327/