jOOQ - MySQL 多行插入...使用 VALUES() 函数进行重复键更新
jOOQ - MySQL multiple row INSERT... ON DUPLICATE KEY UPDATE using VALUES() function
jOOQ 是否支持 VALUES() 函数用于 INSERT...ON DUPLICATE KEY UPDATE?
如果没有,有什么建议可以代替吗? (对于很多行)
参见:http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values
不,从 jOOQ 3.8 开始,没有这样的支持,目前也没有计划添加支持。不过,您可以使用普通的 SQL 轻松实现这一点:
public static <T> Field<T> values(Field<T> field) {
return DSL.field("values({0})", field.getDataType(), field);
}
有关 jOOQ 中 "plain SQL" 的更多信息,请参阅:
http://www.jooq.org/doc/latest/manual/sql-building/plain-sql
2021 年更新,您可以使用 Jooq 的 InsertOnConflictWhereStep。
这是一个示例(在 Kotlin 中):
fun saveOrUpdate(items: Iterable<SomeClass>) {
dsl.insertInto(
TABLE,
TABLE.FIELD1,
TABLE.FIELD2,
).apply {
items.forEach { item ->
values(
item.field1,
item.field2
)
.onConflict(
TABLE.FIELD1
)
.doUpdate()
.set(TABLE.FIELD2, item.field2)
.set(TABLE.UPDATED_AT, currentOffsetDateTime())
}
}
.execute()
}
jOOQ 是否支持 VALUES() 函数用于 INSERT...ON DUPLICATE KEY UPDATE?
如果没有,有什么建议可以代替吗? (对于很多行)
参见:http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values
不,从 jOOQ 3.8 开始,没有这样的支持,目前也没有计划添加支持。不过,您可以使用普通的 SQL 轻松实现这一点:
public static <T> Field<T> values(Field<T> field) {
return DSL.field("values({0})", field.getDataType(), field);
}
有关 jOOQ 中 "plain SQL" 的更多信息,请参阅: http://www.jooq.org/doc/latest/manual/sql-building/plain-sql
2021 年更新,您可以使用 Jooq 的 InsertOnConflictWhereStep。
这是一个示例(在 Kotlin 中):
fun saveOrUpdate(items: Iterable<SomeClass>) {
dsl.insertInto(
TABLE,
TABLE.FIELD1,
TABLE.FIELD2,
).apply {
items.forEach { item ->
values(
item.field1,
item.field2
)
.onConflict(
TABLE.FIELD1
)
.doUpdate()
.set(TABLE.FIELD2, item.field2)
.set(TABLE.UPDATED_AT, currentOffsetDateTime())
}
}
.execute()
}