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

时间:2016-01-05 21:13:26

标签: 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。如果我只是设置它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
);

2 个答案:

答案 0 :(得分:0)

使用INSERT INTO .. DEFAULT VALUES

jOOQ支持针对此用例的DEFAULT VALUES语句的SQL标准INSERT子句:

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语句,这没有任何意义。

答案 1 :(得分:-2)

您可以尝试使用(Long)null代替 <input type="radio" name="signup" value="Seed Program" checked />