Postgres 9.3にjson型の列「sample_column」を含む「test」というテーブルがあります。 Spring/JPAを使用して列に次の内容を書き込もうとしています:{"name": "Updated 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
}
_
JsonコンテンツをマッピングするためのCustomClass:
_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.
_
しかし、testDAO.getSampleColumn().getName();
を使用してJSON列を読み取ることができます。ここでの問題は何ですか? VaryingをJsonに自動的に変換するために、テーブルにキャストを追加したくありません。
ありがとう。
JDBCレベルでsetObject
を使用するか、PgJDBCパラメータstringtype=unspecified
を渡して、文字列型からjson
などへの暗黙的なキャストを許可する必要があります。
これは、PostgreSQLが型キャストに対して厳しすぎるという問題です。
Spring-bootを使用している人にとって、@ Craig Ringerが言ったことを行うには2つの方法があります
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres?stringtype=unspecified
またはプロパティを使用する
spring.datasource.hikari.data-source-properties.stringtype=unspecified