【问题标题】:The column index is out of range: 2, number of columns: 1 error while updating jsonb column列索引超出范围:2,列数:1 更新 jsonb 列时出错
【发布时间】:2020-05-22 16:30:14
【问题描述】:

我正在尝试用 mybatis 更新 java 中的 jsonb 列。

以下是我的映射器方法

@Update("update service_user_assn set external_group = external_group || '{\"service_name\": \"#{service_name}\" }' where user=#{user} " + 
                " and service_name= (select service_name from services where service_name='Google') " )
public int update(@Param("service_name")String service_name,@Param("user") Integer user);

更新 jsonb (external_group) cloumn 时出现以下错误。

### Error updating database.  Cause: org.postgresql.util.PSQLException: The column index is out of range: 2, number of columns: 1.
### The error may involve com.apds.mybatis.mapper.ServiceUserMapper.update-Inline

我可以用同样的方式更新非 jsonb 列。

另外,如果我输入硬编码值,它适用于 jsonb 列。

更新jsonb列时如何解决这个错误?

【问题讨论】:

    标签: postgresql spring-boot mybatis spring-mybatis


    【解决方案1】:

    您不应将#{} 括在单引号中,因为它将成为文字的一部分而不是占位符。即

    external_group = external_group || '{"service_name": "?"}' where ...
    

    因此,PreparedStatement 中只有一个占位符,您会收到错误消息。

    正确的方法是在 SQL 中连接#{}
    您可能还需要将文字显式转换为 jsonb 类型。

    @Update({
      "update service_user_assn set",
      "external_group = external_group",
      "|| ('{\"service_name\": \"' || #{service_name} || '\" }')::jsonb",
      "where user=#{user} and",
      "service_name= (select service_name from services where service_name='Google')"})
    

    正在执行的 SQL 如下所示。

    external_group = external_group || ('{"service_name": "' || ? || '"}')::jsonb where ...
    

    【讨论】:

    • 我正在使用 PostgreSQL,上面的语法不起作用。
    • @sagar.tarle 请创建一个最小的可执行项目,如these 并在 GitHub 上分享。那我去研究一下。
    • @sagar.tarle 看来您需要将文字显式转换为 jsonb 类型。请查看更新后的答案。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多