使用文件 此处 我知道我可以用 onDuplicateKeyUpdate
来处理UPSERT。但是,在插入一个列表值时,如何匹配值呢?我这里使用Postgres作为实际实现。
假设下面的Java采取嵌套List,然后启动一个JOOQ查询。
List<List<String>> values = List.of(List.of("1", "2", "3"), List.of("4", "5", "6"));
dsl.insertInto(TABLE)
.values(values)
.onDuplicateKeyUpdate()
接下来我必须调用 set()
中的流畅调用。然而,由于这是一个嵌套的列表,我无法在这里访问每一项。
例如,假设数据库中已经包含了这一行。
| col1 | col2 | col3 |
+------+------+------+
| 1 | 0 | 0 |
+------+------+------+
由于Col1是主键,我希望上面的代码能进行UPSERT并尝试插入,但在第一行就失败了。更新 col2
&amp。col3
分别进行插入。然后做第二个正常的插入。成为。
| col1 | col2 | col3 |
+------+------+------+
| 1 | 2 | 3 |
+------+------+------+
| 4 | 5 | 6 |
+------+------+------+
作为SQL这将是。
INSERT INTO table(col1, col2 col3)
((1, 2, 3), (4, 5, 6))
ON CONFLICT (col1)
DO UPDATE SET
col1 = excluded.col1,
col2 = excluded.col2,
col3 = excluded.col3
在JOOQ中有没有好的方法来处理这个问题?还是说我应该用原始的SQL,用值来代替绑定?
这里有一个动态多值插入语句的待定功能请求。https:/github.comjOOQjOOQissues6604。
包括一些变通的讨论。今天是可以做的,只是不方便。注意,如果你只针对PostgreSQL,我建议你使用jOOQ的 ON CONFLICT
支持