java - 如何在不设置值的情况下insertInto()并返回新创建的ID?

标签 java jooq

如何在不指定任何值的情况下插入记录并仅返回新创建的 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。如果我只是将其设置为 nullNot-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);

另请参阅: http://www.jooq.org/doc/latest/manual/sql-building/sql-statements/insert-statement/insert-default-values/

为什么会出现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/

相关文章:

java - jOOQ:从连接返回三个对象的列表

java - 特定表的 jooQ 代码生成

JOOQ:multisetAgg 或 toSet 过滤掉 NULL

java - 在 jooq 中访问 sql-array 项目

java - Java SWT的Button大小

java.lang.VerifyError : Verifier rejected class - failed to verify

java - Android 中的日期格式

java - JDialog无法转换为框架

java - Spark Combinebykey JAVA lambda 表达式

java - 来自 trunc() 编辑字段的 JOOQ orderBy()