在 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 开始,支持只读列:
- https://github.com/jOOQ/jOOQ/issues/9864
- https://www.jooq.org/doc/dev/manual/sql-building/column-expressions/readonly-columns/
如果 jOOQ 知道您的 ID
列是只读的(如果它是标识列,它就是只读的),那么如果您相应地配置它,它会从这样的语句中忽略它。
我正在开发 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 开始,支持只读列:
- https://github.com/jOOQ/jOOQ/issues/9864
- https://www.jooq.org/doc/dev/manual/sql-building/column-expressions/readonly-columns/
如果 jOOQ 知道您的 ID
列是只读的(如果它是标识列,它就是只读的),那么如果您相应地配置它,它会从这样的语句中忽略它。