web-dev-qa-db-ja.com

Spring / JPAを使用してPostgresデータベースのJSON列に書き込む

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に自動的に変換するために、テーブルにキャストを追加したくありません。

ありがとう。

15
drunkenfist

JDBCレベルでsetObjectを使用するか、PgJDBCパラメータstringtype=unspecifiedを渡して、文字列型からjsonなどへの暗黙的なキャストを許可する必要があります。

これは、PostgreSQLが型キャストに対して厳しすぎるという問題です。

14
Craig Ringer

Spring-bootを使用している人にとって、@ Craig Ringerが言ったことを行うには2つの方法があります

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres?stringtype=unspecified

またはプロパティを使用する

spring.datasource.hikari.data-source-properties.stringtype=unspecified
1
abbas