问题:我将使用@ 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
答案 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);
}