为了坚持,我使用 Hibernate 6 并在实体上使用:
@JdbcTypeCode(SqlTypes.JSON)
私有字符串值;
保存到数据库时,保存时用引号括起来,并在 json 内转义引号:
“{\“姓名\”:\“pepito \”,\“姓氏\”:\“佩雷斯\”}“
当我使用查询选择值->“名称”不起作用时,我不明白为什么它不按以下方式保存在数据库中:
{“姓名”:“pepito”,“姓氏”:“佩雷斯”}
谢谢。
Hibernate ORM 6.1.3.Final 已修复此问题,用
@JdbcTypeCode(SqlTypes.JSON)
和 @JdbcTypeCode(SqlTypes.SQLXML)
注释的字符串将不再序列化为 JSON/XML。相反,它们将被解释为纯 JSON/XML,以避免序列化/反序列化的开销。
参考
您在这里看到的是 Hibernate 将字符串序列化为 JSON。我想这样做并不是很有用,Hibernate 可以将字符串解释为普通的 JSON,但最后,我宁愿建议您将其建模为
java.util.Map
,然后将其序列化为您期望的正确 JSON 表示形式.
无论哪种方式,我为此创建了一个 Hibernate 问题 (HHH-15458),据我了解,当人们不关心模型中 JSON 结构的表示时,他们会期望这种方式工作。
@Entity
public class Entity {
@JdbcTypeCode(SqlTypes.JSON)
private JsonNode json;
}
@Test
@Commit
void shouldSaveJson() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonMap = objectMapper.readValue(jsonEscapedString,JsonNode.class);
Entity entity = new Entity(jsonMap);
Entity saved = entityRepository.saveAndFlush(question);
entityManager.clear();
Entity fetched = entityRepository.findById(saved.getId()).orElse(null);
Assertions.assertNotNull(fetched);
}
您可以使用 Map 来代替 JsonNode