所以我正在尝试为 JPA (JPQL) 编写一个 native 命名查询以一次性 INSERT
多行数据,并取回插入记录的所有 id(不冲突对主键具有唯一约束)。我正在使用 Postgres 数据库。
数据库看起来像这样:SELECT * FROM table;
id | sent
---+------
1 | f
(1 row)
我想要实现的是这个 PSQL 语句:
INSERT INTO table VALUES (1, false),(2, false) ON CONFLICT 不要返回 id;
应该返回:
id
---
2
(1 row)
所以我最初的想法是在 JPA 中进行原生查询:
@Repository
interface NotificationRepository : JpaRepository<Foo, Int> {
@Modifying
@Query("INSERT INTO Foo VALUES (:foos) ON CONFLICT DO NOTHING RETURNING id", nativeQuery = true)
fun addAllAndReturnInserted(foos: List<Foo>): List<Int>
}
它适用于列表中的一个值,但对于多个值,它将创建一个查询,如:
Hibernate:INSERT INTO Foo VALUES (?, ?) ON CONFLICT DO NOTHING RETURNING id
它抛出一个异常:
PSQLException: ERROR: column "sent" is of type boolean but expression is of type int
有没有办法将列表转换为单独的括号,例如 (?), (?)
而不是一个 (?, ?)
??
最佳答案
不,你的想法很好,但不适用于 Spring Data,因为:
- 列表参数扩展仅作为逗号分隔的数据值列表
(a, b, ...)
发生,而不是记录或行列表(a), (b ), (...)
- 还不支持返回某些内容的数据修改语句(目前):https://jira.spring.io/browse/DATAJPA-1389
但是,至少可以解决此处所述的批处理问题:
关于spring - JPA Native 查询在 INSERT INTO VALUES 中将 List 参数的括号错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56149740/