您在这里发现了一些内容(都与 jOOQ 3.1 和以前的版本相关):
从插入返回默认值:
BugRecord b = jooq.newRecord(BUG);
b.setFoo(3);
b.store();
assertNotNull(b.getBar()); // fails
确实,这将是一个很好的功能。目前,jOOQ 仅获取 IDENTITY 列值。您可以使用INSERT .. RETURNING http://www.jooq.org/doc/3.1/manual/sql-building/sql-statements/insert-statement/#N10F3F语法或UPDATE .. RETURNING http://www.jooq.org/doc/3.1/manual/sql-building/sql-statements/update-statement/#N10FA4语法来显式选择插入或更新后应返回哪些列。但能够在常规的 CRUD 操作中这样做会好得多。
这一点在这个线程 https://groups.google.com/forum/#!topic/jooq-user/_cp2-mrtZ7k/discussion。与此相关的功能请求是#1859 https://github.com/jOOQ/jOOQ/issues/1859.
您可以通过致电解决此问题
b.refresh(); // Refresh all columns
b.refresh(BUG.BAR, ...); // Refresh only some columns
插入 NULL 与通过插入 DEFAULTUpdatableRecord
:
Record r = jooq.select().from(BUG).fetchOne();
assertEquals(new Integer(-1), r.getValue(BUG.BAR)); // fails
在我看来,这是一个错误。 jOOQ的CRUD操作应该是DEFAULT
价值安全。仅那些在之前已明确设置的值store()
/ insert()
/ update()
操作应该在生成的 SQL 中呈现。我已经注册了#2698 https://github.com/jOOQ/jOOQ/issues/2698为了这。
插入 NULL 与通过插入 DEFAULTDAO
:
// DataMapper pattern
Bug b = new Bug();
b.setFoo(3);
bugDao.insert(b); // Fails because it tries to set "bar" to NULL
不错的收获。解决/增强这个问题并不简单,因为 POJO 并未在每列中附带内部“已更改”/“脏”标志。因此不可能知道 a 的含义null
POJO 中的引用。
另一方面,jOOQ 已经知道列是否可以为空。如果 jOOQ 还维护有关某个对象是否存在的元数据DEFAULT
列上的子句,可以推断出组合NOT NULL DEFAULT
将不得不导致:
INSERT INTO bug(foo, bar)
VALUES(3, DEFAULT)
And to
UPDATE bug SET bar = DEFAULT WHERE foo = 3
我已经注册了
-
#2699 https://github.com/jOOQ/jOOQ/issues/2699:在生成的代码中添加一些元数据信息
-
#2700 https://github.com/jOOQ/jOOQ/issues/2700:利用来自 DAO 的 SQL 中的上述元数据