我正在尝试使用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)克隆时出现以下错误。
### 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列时如何解决此错误?
答案 0 :(得分:0)
请勿将#{}
用单引号引起来,因为它将成为文字而不是占位符的一部分。即
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 ...