在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的主要内容,如果未能解决你的问题,请参考以下文章