如何解决将JsonNode对象映射到SQL DB JPA中的String字段
我有一个带有这些字段的Sql表:
id uniqueidentifier primary key,<--Omitting extra fields -->
metadata nvarchar(max)
我也有一个映射到它的实体:
@Data
public class GenericEntity implements Serializable {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2",strategy = "org.hibernate.id.UUIDGenerator")
@Type(type = "uuid-char")
private UUID id;
<--Omitting extra properties -->
@Type(type = "string")
private JsonNode metadata;
}
作为JsonNode的第二个字段需要能够接受不同类型的json并将其作为字符串存储在表中。
如何转换JsonNode字段并将其作为String存储在数据库中,然后当我从表中读取时,它将String转换回JsonNode? p>
有效载荷:
{
"id": "db8e8d4b-eee2-4507-bf30-f55c3f948724",<-- Omitting extra properties -->
"metadata": {
"description": "Sample","location": "Stack Overflow"
}
}
现在,每次我尝试保存它时,我都会收到错误消息:
Could not determine type for: com.fasterxml.jackson.databind.JsonNode,at table: table_name,for columns: [org.hibernate.mapping.Column(metadata)]
解决方法
我遵循以下指示: https://www.baeldung.com/hibernate-custom-types
创建了SqlTypeDescriptor
Request
然后我创建了一个Java类型描述符:
getCatalog(): Observable<CatalogItem[]> {
return this.http.get<Workspace[]>(`${this.baseUrl}/workspace`).pipe(
switchMap( (ws) => {
return {
workspace: ws,requests: this.http.get<Request[]>(`${this.baseUrl}/${ws.id}/requests`).subscribe();
}
})
);
//TODO: combine workspace and request create catalog obj
}
然后将类型定义添加到实体模型
public class JsonNodeStringType extends AbstractSingleColumnStandardBasicType<JsonNode> implements DiscriminatorType<JsonNode> {
public static final JsonNodeStringType INSTANCE = new JsonNodeStringType();
public JsonNodeStringType() {
super(VarcharTypeDescriptor.INSTANCE,JsonNodeStringJavaDescriptor.INSTANCE);
}
@Override
public String getName() {
return "jsonnode";
}
@Override
public JsonNode stringToObject(String xml) {
return fromString(xml);
}
@Override
public String objectToSQLString(JsonNode value,Dialect dialect) {
return '\'' + toString(value) + '\'';
}
}
如果您不想手动创建这些类型描述符,也可以按照本文使用外部依赖项:https://vladmihalcea.com/sql-server-json-hibernate/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。