У меня есть таблица под названием "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.
Спасибо.