在executeInsert()之后的JOOQ,需要知道自动生成的ID

Posted

技术标签:

【中文标题】在executeInsert()之后的JOOQ,需要知道自动生成的ID【英文标题】:JOOQ after executeInsert(), need to know the auto-generated ID 【发布时间】:2018-11-10 15:17:16 【问题描述】:

使用 JOOQ(带有 sqlite3)。

有一些看起来像这样的代码: (修改自文档中的示例:https://www.jooq.org/doc/latest/manual/sql-execution/fetching/pojos/)

// A "mutable" POJO class
public class MyBook 
  public int id;
  public String title;


// Create a new POJO instance
MyBook myBook = new MyBook();
// myBook.id = 10; <-- Id is NOT set here because the database auto-generates it
myBook.title = "Animal Farm";

// Load a jOOQ-generated BookRecord from your POJO
BookRecord book = create.newRecord(BOOK, myBook);

// Insert it (explicitly)
create.executeInsert(book);

// What is value of the auto-generated id?

此时,我需要知道数据库中自动生成的 ID。

关于如何获得它的任何想法? 还是需要先设置ID再保存?

【问题讨论】:

【参考方案1】:

使用executeInsert() 似乎无法取回 ID:

// Insert it (explicitly)
create.executeInsert(book);

但是使用Record.store 会:

book.store()

以下是如何从 POJO 转到 Record 以便可以存储 PJO,然后使用生成的 ID 获取更新的 POJO:

// A "mutable" POJO class
public class MyBook 
  public int id;
  public String title;


// Create a new POJO instance
MyBook myBook = new MyBook();
// myBook.id = 10; <-- Id is NOT set here because the database auto-generates it
myBook.title = "Animal Farm";

// Load a jOOQ-generated BookRecord from your POJO
BookRecord book = create.newRecord(BOOK, myBook);

// Insert it (implicitly) using the BookRecord instead of create.executeInsert()
book.store();            // <--- THIS IS THE KEY DIFFERENCE

// Get new Book POJO from the BookRecord
MyBook newBook = book.into(MyBook.class);

// This is also a handy function to get the Record as Map, 
//   which is easier to view in the debugger
Map<String, Object> bookMap = book.intoMap();

【讨论】:

我在这里评论晚了。我今天才发现这个问答。你知道 SQLite 函数last_insert_rowid() 吗? (参考:sqlite.org/c3ref/last_insert_rowid.html)我不知道您的确切表架构,但它可能是可能的。您需要进行一些实验...使用 jOOQ,您可以执行以下操作:select last_insert_rowid(),它将返回 SQLDataType.BIGINT / long

以上是关于在executeInsert()之后的JOOQ,需要知道自动生成的ID的主要内容,如果未能解决你的问题,请参考以下文章

SQL 方言如何在 hibernate 和 JOOQ 等框架内部实际工作

JOOQ + JPA 实体

如何在 JOOQ 中公开新的 SQL 函数

如何在JOOQ中公开新的SQL函数

JOOQ 入门-- CRUD 语句

JOOQ 入门-- CRUD 语句