Запись в столбец JSON базы данных Postgres с использованием Spring/JPA

У меня есть таблица под названием "test", содержащая столбец "sample_column" типа json в Postgres 9.3. Я пытаюсь написать следующее содержимое в столбце, используя Spring/JPA: { "name": "Обновленное имя" }

Я читал на других сообщениях, что мне нужно добавить настраиваемый конвертер, чтобы сопоставить строку с типом json. Это код, который у меня есть сейчас:

TestDAO.java:

@Entity
@Table(name="test")
public class TestDAO implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id", unique=true, nullable=false)
    private Long id;   

    @Column(name="sample_column")
    @Convert(converter = MyCustomConverter.class)
    private MyCustomClass sampleColumn;

    // Getter / Setters
}

CustomClass для отображения содержимого json:

public class MyCustomClass {
    @JsonProperty("name")
    public String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

И, наконец, ConverterClass:

@javax.persistence.Converter
public class MyCustomConverter implements AttributeConverter<MyCustomClass, String> {

    private final static ObjectMapper objectMapper = new ObjectMapper();

    @Override
    @NotNull
    public String convertToDatabaseColumn(@NotNull MyCustomClass myCustomObject) {
        try {
            return objectMapper.writeValueAsString(myCustomObject);
        } catch (Exception ex) {
            return null;
        }
    }

    @Override
    @NotNull
    public MyCustomClass convertToEntityAttribute(@NotNull String databaseDataAsJSONString) {
        try {
            return objectMapper.readValue(databaseDataAsJSONString, MyCustomClass.class);
        } catch (Exception ex) {
            return null;
        }
    }
}

Теперь я пытаюсь установить столбец json следующим образом:

testDAO.getSampleColumn().setName("Updated name");
testRepository.saveAndFlush(testDAO);

Но когда я пытаюсь сохранить его, я получаю следующую ошибку:

Caused by: org.postgresql.util.PSQLException: ERROR: column "sample_column" is of type json but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.

Однако я могу прочитать столбец JSON, используя testDAO.getSampleColumn().getName(); В чем проблема? Я не хочу добавлять какие-либо данные в таблицу для автоматического преобразования Varying в Json.

Спасибо.

Ответ 1

Вам нужно либо использовать setObject на уровне JDBC, либо передать параметр PgJDBC stringtype=unspecified, чтобы разрешить неявные отбрасывания от типов строк до json и т.д.

Это проблема с PostgreSQL, слишком строгим в отношении литья типов.