jOOQ 插入查询并返回生成的键

Posted

技术标签:

【中文标题】jOOQ 插入查询并返回生成的键【英文标题】:jOOQ insert query with returning generated keys 【发布时间】:2011-12-28 23:13:56 【问题描述】:

我将 jOOQ 安装到 Eclipse 中,为我的 mysql 生成了类,但我仍然无法编写一些基本查询。

我尝试通过返回生成的键来编写插入查询,但编译器抛出错误

表:tblCategory 列:category_id、parent_id、name、rem、uipos

Result<TblcategoryRecord> result= create.insertInto(Tblcategory.TBLCATEGORY, 
    Tblcategory.PARENT_ID, Tblcategory.NAME, Tblcategory.REM, Tblcategory.UIPOS)
        .values(node.getParentid())
        .values(node.getName())
        .values(node.getRem())
        .values(node.getUipos())
        .returning(Tblcategory.CATEGORY_ID)
        .fetch();

还尝试了其他不同的方法 如何正确地做到这一点?

谢谢 魅力

【问题讨论】:

【参考方案1】:

您使用的语法是用于插入多条记录。这将插入 4 条记录,每条记录都有一个字段。

.values(node.getParentid())
.values(node.getName())
.values(node.getRem())
.values(node.getUipos())

但是你声明了 4 个字段,所以这行不通:

create.insertInto(Tblcategory.TBLCATEGORY, 
  Tblcategory.PARENT_ID, Tblcategory.NAME, Tblcategory.REM, Tblcategory.UIPOS)

你可能想做的是:

Result<TblcategoryRecord> result = create
  .insertInto(Tblcategory.TBLCATEGORY, 
    Tblcategory.PARENT_ID, Tblcategory.NAME, Tblcategory.REM, Tblcategory.UIPOS)
  .values(node.getParentid(), node.getName(), node.getRem(), node.getUipos())
  .returning(Tblcategory.CATEGORY_ID)
  .fetch();

或者:

Result<TblcategoryRecord> result = create
  .insertInto(Tblcategory.TBLCATEGORY) 
  .set(Tblcategory.PARENT_ID, node.getParentid())
  .set(Tblcategory.NAME, node.getName())
  .set(Tblcategory.REM, node.getRem())
  .set(Tblcategory.UIPOS, node.getUipos())
  .returning(Tblcategory.CATEGORY_ID)
  .fetch();

也许,你会更好地使用

TblcategoryRecord result =
  // [...]
  .fetchOne();

有关更多详细信息,请参阅手册:

http://www.jooq.org/doc/2.6/manual/sql-building/sql-statements/insert-statement/

或用于创建返回值的 INSERT 语句的 Javadoc:

http://www.jooq.org/javadoc/latest/org/jooq/InsertReturningStep.html

【讨论】:

谢谢,添加了首选解决方案,但 Eclipse 仍需要强制转换 @Charis997:通常不建议将答案放在 Stack Overflow 上的问题中。后续访问者将很难理解发生了什么。相反,如果这个答案不够清楚,您可以“接受”这个答案,或者自己提供一个答案 @Charis997:关于选角:你是对的。对于 jOOQ 2.0,这将不再是必要的。但是 jOOQ 1.6.9 仍然需要它 让我们尊重代码!首选解决方案发布在下面的答案中。期待 jOOQ 2.0 Thx @andresp,您可以调用set(record),将更改的字段从记录转移到插入语句...【参考方案2】:

首选解决方案

  try 
    TblcategoryRecord record = (TblcategoryRecord) create
      .insertInto(Tblcategory.TBLCATEGORY) 
      .set(Tblcategory.PARENT_ID, node.getParentid())
      .set(Tblcategory.NAME, node.getName())
      .set(Tblcategory.REM, node.getRem())
      .set(Tblcategory.UIPOS, node.getUipos())
      .returning(Tblcategory.CATEGORY_ID)
      .fetchOne();

      node.setId(record.getCategoryId());

     catch (SQLException e1)  

【讨论】:

你真的不应该忽略那个 SQLException!如果这只是一个示例,您可以将整个 try/catch 块排除在外。【参考方案3】:

试试

YoutableRecord result = create
.insertInto(YOURTABLE)
.set(YOURTABLE.PROD_NAME, "VAL")
.returning(YOURTABLE.ID_PR)
.fetchOne();


int id = result.getValue(Products.PRODUCTS.ID_PR);

【讨论】:

以上是关于jOOQ 插入查询并返回生成的键的主要内容,如果未能解决你的问题,请参考以下文章

使用 JOOQ 在通用插入中返回 id

有没有办法用 JOOQ 生成 DAO,findById 返回 Optional

如果基于一个字段的所有行在另一个字段上具有不同的值,则 JOOQ 查询返回一个布尔值

org.jooq.Query.getBindValues() 返回的 List<Object> 是不是包含类型安全的对象 - 对于每个查询参数?

使用 jOOQ UPserting 到 Postgres 表时返回更新的行数

jOOQ - 支持 UPDATE ... SET ... 任意程度的查询