如何为原始JSON + JSON(B)PostgreSQL实现Hibnernate类型

时间:2018-05-02 14:49:31

标签: java postgresql hibernate

问题:我将使用@ vlad-mihalcea的[Hibernate-Types] [1],我需要在我的实体中为原始JSON值实现Hibernate类型:

public class Entity {
  ...
  @Type(type = "rawjson") // or rawjsonb
  private String json;
}

对于(字符串)'json'类型我实现了:

public class RawJsonStringType extends ImmutableType<String> {

    public RawJsonStringType() {
        super(String.class);
    }

    @Override
    protected String get(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws SQLException {
        return rs.getString(names[0]);
    }

    @Override
    protected void set(PreparedStatement st, String value, int index, SharedSessionContractImplementor session) throws SQLException {
        st.setString(index, value);
    }

    @Override
    public int[] sqlTypes() {
        return new int[] { JAVA_OBJECT }; // it creates a 'json' column
    }

}

对于(二进制)'jsonb'类型:

public class RawJsonBinaryType extends ImmutableType<String> {

    public RawJsonBinaryType() {
        super(String.class);
    }

    @Override
    protected String get(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws SQLException {
        return rs.getString(names[0]);
    }

    @Override
    protected void set(PreparedStatement st, String value, int index, SharedSessionContractImplementor session) throws SQLException {
        st.setString(index, value);
    }

    @Override
    public int[] sqlTypes() {
        return new int[] { JAVA_OBJECT - 1 }; // to have a 'jsonb' column, must be registered in the dialect: registerColumnType(Types.JAVA_OBJECT - 1, "json");
    }

}

但是当我测试它时,它会失败并显示以下内容:

  

引起:org.postgresql.util.PSQLException:错误:列“rawjson”的类型为json,但表达式的类型为字符变化
   提示:您需要重写或转换表达式    位置:123

2 个答案:

答案 0 :(得分:1)

只需将其映射为JsonNode即可。因此,从String开始,您需要构建杰克逊JsonNode

如果要将其映射为String,则必须编写新的自定义类型。但是,你为什么要这样做?

答案 1 :(得分:0)

几乎是正确的:

@Override
protected void set(PreparedStatement st, String value, int index, SharedSessionContractImplementor session) throws SQLException {
    st.setObject(index, value, Types.OTHER);
}