Spring data JPA 原生查询 - 如何使用 postgresql 数组中定义的查询参数?

问题描述 投票:0回答:1

我正在尝试更新 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);

我错过了什么吗?

java postgresql spring-data-jpa jsonb
1个回答
0
投票

对于您的情况,我建议您检查连接的字符串之间是否有适当的空格,以避免语法错误。

我看到在你的sql查询中,

pos- 1 as elem_index
之后,
FROM
之前似乎没有空格。您应该在那里留一个空格来正确分隔各个子句。

此外,您还应确保参数占位符(

:studentId
:subjectId
:subject
)在查询执行期间是否正确定位并替换为实际参数值。

© www.soinside.com 2019 - 2024. All rights reserved.