jOOQ 是否支持在 INSERT...ON DUPLICATE KEY UPDATE 中使用 VALUES() 函数?
如果没有,有什么建议可以替代吗? (对于很多行)
参见:http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values
jOOQ 在 API 中没有 MySQL 特定的
VALUES()
支持,但从 jOOQ 3.17 开始,您可以通过 DSL.excluded()
使用 PostgreSQL 特定的等效项。 这记录在此处。
这样的声明:
insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
.values(3, "X")
.onDuplicateKeyUpdate()
.set(AUTHOR.LAST_NAME, excluded(AUTHOR.LAST_NAME))
.execute();
将被翻译成这个 MySQL 等效语句:
INSERT INTO AUTHOR (ID, LAST_NAME)
VALUES (
3,
'X'
)
AS t
ON DUPLICATE KEY UPDATE
AUTHOR.LAST_NAME = t.LAST_NAME
或者在旧版本的 MySQL 上:
INSERT INTO AUTHOR (ID, LAST_NAME)
VALUES (
3,
'X'
)
ON DUPLICATE KEY UPDATE
AUTHOR.LAST_NAME = VALUES(LAST_NAME)
请注意,较新版本的 MySQL 已弃用
VALUES(column_name)
,因此不应再使用。
从 jOOQ 3.8 开始,没有此类支持,目前也没有计划添加支持。不过,您可以使用简单的 SQL 轻松实现这一点:
public static <T> Field<T> values(Field<T> field) {
return DSL.field("values({0})", field.getDataType(), field);
}
有关 jOOQ 中“普通 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()
}