我正在尝试更新 jsonb 列,其中我有类似于此结构的数据:
{
"id": 1,
"name": "John doe",
"address": {
"street": "123 street",
"city": "new york",
"country": "US",
"postalcode": "123456"
},
"subjects": [
{
"subjectId": "123",
"name": "science",
"modules": 12
},
{
"subjectId": "124",
"name": "physics",
"modules": 5
}
]
}
并且,我正在尝试使用以下查询更新主题数组:
update
student set student_details =
jsonb_set( student_details, array['subjects', elem_index::text],
'{
"subjectId": "123",
"name": "science-1",
"modules": 6
}'::jsonb,
true)from (
select
pos- 1 as elem_index
from
student, jsonb_array_elements(student->'subjects') with ordinality arr(elem, pos)
where id = 1 and
elem->>'subjectId' = '123'
) sub
where
id = 1;
当我直接在 postgresql pgAdimin 中执行它时,它工作正常。
但是,当我尝试将其用作 Spring data JPA 本机查询时,它给了我错误,这与 ARRAY 内的“elem_index”有关:
引起的:org.hibernate.hql.internal.ast.QuerySyntaxException: 期待 CLOSE_BRACKET,在第 1 行第 83 列附近发现 ',' [更新 学生集学生详细信息 = jsonb_set(学生详细信息, ARRAY['subjects',cast(elem_index as text)],cast(:subject as jsonb), false) FROM ( SELECT pos- 1 as elem_index FROM
学生,jsonb_array_elements(student_details -> 'subjects')WITH 序数 arr(elem, pos) WHERE id = :studentId AND
elem->>'subjectId' = :subjectId ) SUB WHERE id = :studentId]
本机查询在存储库中如下所示:
@Modifying
@Transactional
@Query(value = "UPDATE student " +
"SET student_details = jsonb_set(" +
"student_details, ARRAY['subjects', cast(elem_index as text)]," +
" cast(:subject as jsonb), false" +
") " +
"FROM (" +
" SELECT " +
" pos- 1 as elem_index" +
" FROM " +
" student, jsonb_array_elements(" +
"student_details -> 'subjects'" +
") WITH ordinality arr(elem, pos)" +
" WHERE id = :studentId" +
" AND" +
" elem->>'subjectId' = :subjectId" +
" ) SUB" +
" WHERE" +
" id = :studentId")
Integer updateStudentDetailsSubjects(@Param("studentId") String studentId, @Param("subjectId") String subjectId, @Param("subject") String subject);
我错过了什么吗?
对于您的情况,我建议您检查连接的字符串之间是否有适当的空格,以避免语法错误。
我看到在你的sql查询中,
pos- 1 as elem_index
之后,FROM
之前似乎没有空格。您应该在那里留一个空格来正确分隔各个子句。
此外,您还应确保参数占位符(
:studentId
、:subjectId
、:subject
)在查询执行期间是否正确定位并替换为实际参数值。