Postgresql Jsonb Java Hibernate 6 JdbcTypeCode

问题描述 投票:0回答:3

为了坚持,我使用 Hibernate 6 并在实体上使用:

@JdbcTypeCode(SqlTypes.JSON)

私有字符串值;

保存到数据库时,保存时用引号括起来,并在 json 内转义引号:

“{\“姓名\”:\“pepito \”,\“姓氏\”:\“佩雷斯\”}“

当我使用查询选择值->“名称”不起作用时,我不明白为什么它不按以下方式保存在数据库中:

{“姓名”:“pepito”,“姓氏”:“佩雷斯”}

谢谢。

java postgresql hibernate jsonb sql-types
3个回答
6
投票

Hibernate ORM 6.1.3.Final 已修复此问题,用

@JdbcTypeCode(SqlTypes.JSON)
@JdbcTypeCode(SqlTypes.SQLXML)
注释的字符串将不再序列化为 JSON/XML。相反,它们将被解释为纯 JSON/XML,以避免序列化/反序列化的开销。

参考

https://in.relation.to/2022/09/08/hibernate-orm-613-final/


1
投票

您在这里看到的是 Hibernate 将字符串序列化为 JSON。我想这样做并不是很有用,Hibernate 可以将字符串解释为普通的 JSON,但最后,我宁愿建议您将其建模为

java.util.Map
,然后将其序列化为您期望的正确 JSON 表示形式.

无论哪种方式,我为此创建了一个 Hibernate 问题 (HHH-15458),据我了解,当人们不关心模型中 JSON 结构的表示时,他们会期望这种方式工作。


0
投票
@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

© www.soinside.com 2019 - 2024. All rights reserved.