Индекс столбца выходит за пределы диапазона: 2, количество столбцов: 1 ошибка при обновлении столбца jsonb - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь обновить столбец jsonb в java с помощью mybatis.

Ниже описан мой метод сопоставления

@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?

1 Ответ

0 голосов
/ 06 февраля 2020

Не следует заключать #{} в одинарные кавычки, так как он станет частью литерала, а не заполнителя. то есть

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 ...
...