Spring JPA本机查询在插入值时将列表参数的括号放错了
因此,我试图为JPA(JPQL)编写一个本机命名查询,一次插入多行数据,并获取插入记录的所有id(与主键上的唯一约束不冲突)。我正在使用Postgres数据库 数据库如下所示:Spring JPA本机查询在插入值时将列表参数的括号放错了,spring,postgresql,hibernate,jpa,kotlin,Spring,Postgresql,Hibernate,Jpa,Kotlin,因此,我试图为JPA(JPQL)编写一个本机命名查询,一次插入多行数据,并获取插入记录的所有id(与主键上的唯一约束不冲突)。我正在使用Postgres数据库 数据库如下所示:SELECT*fromtable id | sent ---+------ 1 | f (1 row) 我想要实现的是以下PSQL语句: 将冲突时的值(1,false)、(2,false)插入表中,不执行任何操作返回id 应返回: id --- 2 (1 row) 所以我最初的想法是用JPA进行本机查询: @存储库
SELECT*fromtable代码>
id | sent
---+------
1 | f
(1 row)
我想要实现的是以下PSQL语句:
将冲突时的值(1,false)、(2,false)插入表中,不执行任何操作返回id代码>
应返回:
id
---
2
(1 row)
所以我最初的想法是用JPA进行本机查询:
@存储库
接口通知存储库:JpaRepository{
@修改
@查询(“在冲突时插入Foo值(:foos)不执行任何操作返回id”,nativeQuery=true)
趣味addAllAndReturnInserted(foos:List):列表
}
它适用于列表中的一个值,但对于多个值,它将创建如下查询:
Hibernate:在冲突时插入Foo值(?),不执行任何操作返回id
它抛出了一个异常:
PSQLException:错误:“发送”列的类型为布尔,但表达式的类型为int
是否有一种方法可以将列表转换为单独的perenthese,如(?),(?)
,而不是一个(?,?)
?,不,您的想法很好,但无法处理Spring数据,因为:
列表参数扩展仅作为以逗号分隔的数据值列表(a,b,…)
,而不是记录或行列表(a),(b),(…)
还不支持返回某些内容的数据修改语句(目前):
但是,至少有一个解决分批问题的方法,如下所述:
列表不能这样做。Hibernate不知道在本机查询中尝试为您拆分列表意味着什么。您可以让在冲突时插入表值(?),不执行任何操作返回id
@coladict您对如何按照我的问题中所述构建查询还有其他建议吗?