我有使用 Postgres DB 的 micronaut 应用程序。最近我需要将 JSONB 字段添加到我的表中。
但是我找不到适合我的案例的任何可行解决方案。这是我的代码:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.inject.Singleton;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import lombok.RequiredArgsConstructor;
import java.io.IOException;
import java.util.List;
@Singleton
@RequiredArgsConstructor
@Converter(autoApply = true)
public class JsonbConverter implements AttributeConverter<List<Metadata>, String> {
private final ObjectMapper objectMapper;
@Override
public String convertToDatabaseColumn(List<Metadata> attribute) {
try {
return attribute == null ? null : objectMapper.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
throw new RuntimeException("Error converting to JSON", e);
}
}
@Override
public List<Metadata> convertToEntityAttribute(String dbData) {
try {
return dbData == null ? null : objectMapper.readValue(dbData,
objectMapper.getTypeFactory().constructCollectionType(List.class, Metadata.class));
} catch (IOException e) {
throw new RuntimeException("Error parsing JSON", e);
}
}
}
这是我的元数据。顺便说一下,我尝试了Map
@Data
@Introspected
@JsonInclude(JsonInclude.Include.NON_NULL)
@Schema(title = METADATA_TITLE, description = METADATA_DESCRIPTION)
public class Metadata {
@NotBlank
@Size(min = 1, max = 1000)
private String field;
@NotBlank
@Size(min = 1, max = 1000)
private String value;
@JsonCreator
public Metadata(@JsonProperty("field") String field,
@JsonProperty("value") String value) {
this.field = field;
this.value = value;
}
}
这是我存储字段的实体对象:
@Value
@Embeddable
class StoredIndexingDetails {
@Nullable
// @Convert(converter = JsonbConverter.class)
@TypeDef(type = DataType.JSON, converter = JsonbConverter.class)
// @Column(name = "indexing_primary_metadata", columnDefinition = "jsonb")
List<Metadata> primaryMetadata;
}
如前所述,尝试了不同的方法。尝试添加
@Column(name = "indexing_primary_metadata", columnDefinition = "jsonb")
。
接下来是我的错误:
Error executing PERSIST: ERROR: column \"indexing_primary_metadata\" is of type jsonb but expression is of type character varying\n Hint: You will need to rewrite or cast the expression.
我也尝试添加
@ColumnTransformer(write = "?::jsonb")
代码没有抛出错误,但 db 字段为空。
有什么建议吗?
我已经成功解决了这个问题。 所以,基本上,我的 @TypeDef(type = DataType.JSON, converter = JsonbConverter.class) 解决方案似乎有效。 我在表中收到 null 的原因是因为在我的代码中,由于嵌套实体的问题,该字段为 null。
对于那些试图寻找解决方案的人:
@Column(columnDefinition = "json", name = "test_field")
@TypeDef(type = DataType.JSON, converter = JsonbConverter.class)
final List<Metadata> testField;
以上应该有效。 JsonbConverter 的代码有问题。