0

我正在尝试使用 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 列时如何解决此错误?

4

1 回答 1

0

您不应该#{}用单引号括起来,因为它将成为文字的一部分而不是占位符。IE

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

所以,只有一个占位符,PreparedStatement你会得到错误。

正确的方法是连接#{}in 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 ...
于 2020-02-06T15:54:35.817 回答