我有一个简单的方法(使用jooq),基本上是这样做的:
MyObject myObject = ...;
MyObjectRecord myObjectRecord = MyConvertor.convertor(myObject);
DSLContext create = ...;
create.insertInto(Tables.MY_OBJECT)
.set(MyObjectRecord)
.execute();
在'MY_OBJECT'表中,我有一个字段'id',定义为:
id SERIAL NOT NULL;
每当我运行上面提到的代码时,我都会收到错误:
Exception in thread "main" org.jooq.exception.DataAccessException: SQL [insert into "public"."myobject" ("somefield", "id") values (?, ?)];
ERROR: null value in column "id" violates not-null constraint
Failing row contains (somevalue, null).
正如我所看到的,问题是jOOq正在尝试将值写入标识列。 MyConvertor
将其保持为null的原因是因为该值将由db生成。如何让jooq不尝试将null
写入此字段?
答案 0 :(得分:0)
我认为您想要做的是明确定义您想要set
的列和值,而不是通过insert
传递整个对象,因为您只需要insert
a他们的子集。
例如:
create.insertInto(Tables.MY_OBJECT, "somefield")
.values(MyObjectRecord.getSomeField()).execute();
假设MyObjectRecord
有一个getSomeField
方法,可以检索该字段的值。
insertInto
的第一个参数是表名,后跟列名的vararg列表。 values
然后获取列值的vararg列表。这允许您指定特定的列/值对,它们是整个对象的子集。
您也可以使用set
样式,但是将列/值对作为参数进行枚举,即:。
create.insertInto(Tables.MY_OBJECT)
.set("somefield", MyObjectRecord.getSomeField())
.execute();
注意:未经测试,但我认为上述之一(或两者)应该有效。
根据OP的评论进行编辑:
确定...如果您使用的对象版本根本不包含id
列,那么 jOOQ 将无法使用它?你可能有一个没有id
列的基础对象,然后有一个派生的对象,它会在你需要的时候在顶部添加id
列。