java - 如何在 JPA 中使用 Postgres JSONB 数据类型?

标签 java json postgresql jpa eclipselink

我找不到使用 JPA (EclipseLink) 从 PostgreSQL 映射 JSON 和 JSONB 数据类型的方法。有人在 JPA 中使用这种数据类型并且可以给我一些工作示例吗?

最佳答案

所有的答案都帮助我找到了为 JPA 而不是专门为 EclipseLink 或 Hibernate 准备的最终解决方案。

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import javax.json.Json;
import javax.json.JsonObject;
import javax.persistence.Converter;
import org.postgresql.util.PGobject;

@Converter(autoApply = true)
public class JsonConverter implements javax.persistence.AttributeConverter<JsonObject, Object> {

  private static final long serialVersionUID = 1L;
  private static ObjectMapper mapper = new ObjectMapper();

  @Override
  public Object convertToDatabaseColumn(JsonObject objectValue) {
    try {
      PGobject out = new PGobject();
      out.setType("json");
      out.setValue(objectValue.toString());
      return out;
    } catch (Exception e) {
      throw new IllegalArgumentException("Unable to serialize to json field ", e);
    }
  }

  @Override
  public JsonObject convertToEntityAttribute(Object dataValue) {
    try {
      if (dataValue instanceof PGobject && ((PGobject) dataValue).getType().equals("json")) {
        return mapper.reader(new TypeReference<JsonObject>() {
        }).readValue(((PGobject) dataValue).getValue());
      }
      return Json.createObjectBuilder().build();
    } catch (IOException e) {
      throw new IllegalArgumentException("Unable to deserialize to json field ", e);
    }
  }
}

关于java - 如何在 JPA 中使用 Postgres JSONB 数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39830842/

相关文章:

跟踪实例化对象数量的 Java 类变量

java - Volley /安卓 : post request but parameters not received

java - Maven:在打包期间执行antrun任务

java - 在没有默认构造函数的内部类时使用 Jackson 解码 JSON

java - 在 Jackson 中序列化/反序列化别名基元,无需太多样板

postgresql - 在 PostgreSQL 中使用子查询

java - 如何解决 "non-static class T cannot be referenced from a static context"?

jquery - 如何在 .getJSON jQuery 中设置编码

python - 使用 HAVING 选择 SQLAlchemy 列的计数和值

PostgreSQL 获取将在接下来的 2 天内过期的记录