在 JOOQ 中插入多行 + 返回 ID

Inserting multiple rows in the JOOQ + returning the ids

我正在开发 Spring 引导应用程序,我在其中使用 JOOQ 3.15.5 版与数据库进行通信。现在我试图在数据库中插入多行并将 ID 作为结果集。我怎样才能做到这一点?我尝试使用 valuesOfRecords 插入记录集合,但我无法让它工作,因为它迫使我放入 MY_TABLE 的所有字段,包括未知 ID。我试过了:

context
   .insertInto(MY_TABLE, MY_TABLE.ID, MY_TABLE.STATUS, MY_TABLE.NAME)
   .valuesOfRecords(records)
   .returningResult(MY_TABLE.ID)
   .fetchInto(Long.class);

谢谢!

解决手头的问题

不必 包含 ID 列。为什么不直接写这个呢?

context

   // No ID column here
   .insertInto(MY_TABLE, MY_TABLE.STATUS, MY_TABLE.NAME)

   // Use a Record2<?, ?> type here
   .valuesOfRecords(records)
   .returningResult(MY_TABLE.ID)
   .fetchInto(Long.class);

如果您的记录是生成的 MyTableRecord,您配置为扩展 Record3<?, ?, ?>,您只需将所需内容映射到 Record2<?, ?>,甚至映射到 Row2<?, ?>:

context
   .insertInto(MY_TABLE, MY_TABLE.STATUS, MY_TABLE.NAME)
   .valuesOfRows(records
       .stream()
       // An example mapping. 
       .map(r -> row(r.getStatus(), r.getName()))
       .toList()
    )
   .returningResult(MY_TABLE.ID)
   .fetchInto(Long.class);

jOOQ 3.15 org.jooq.Rows 实用程序有一些映射函数可以帮助处理这种情况。你甚至可以写:

context
   .insertInto(MY_TABLE, MY_TABLE.STATUS, MY_TABLE.NAME)
   .valuesOfRows(records
       .stream()
       .collect(Rows.toRowList(r -> r.getStatus(), r -> r.getName()))
    )
   .returningResult(MY_TABLE.ID)
   .fetchInto(Long.class);

使用 3.16 只读列

从 jOOQ 3.16 开始,支持只读列:

如果 jOOQ 知道您的 ID 列是只读的(如果它是标识列,它就是只读的),那么如果您相应地配置它,它会从这样的语句中忽略它。