spring - JPA Native 查询在 INSERT INTO VALUES 中将 List 参数的括号错误

标签 spring postgresql hibernate jpa kotlin

所以我正在尝试为 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,因为:

  1. 列表参数扩展仅作为逗号分隔的数据值列表 (a, b, ...) 发生,而不是记录或行列表 (a), (b ), (...)
  2. 还不支持返回某些内容的数据修改语句(目前):https://jira.spring.io/browse/DATAJPA-1389

但是,至少可以解决此处所述的批处理问题:

关于spring - JPA Native 查询在 INSERT INTO VALUES 中将 List 参数的括号错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56149740/

相关文章:

java - 如何使用参数 @RequestBody Json 请求纠正 Spring Boot Rest Api 中的 OverPosting?

java - 如何通过本地网络向服务器发送请求

java - Spring Hibernate 数据库连接

hibernate - 为什么 FetchType.LAZY 在 Hibernate/JPA 中不起作用?

java - 从 JPA 实体逆向工程 DDL

java - 如何在 Spring MVC 中根据用户输入创建新的 url

python - 多线程 python psycopg2

postgresql - Docker:存储库名称必须小写

postgresql - 使用另一个表中的值在表中进行计算

java - 是否可以用 int 代替 List