当前位置: 首页 > 知识库问答 >
问题:

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

阮雅达
2023-03-14

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

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

对于(string)'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类型,但表达式是character varieting类型
提示:您需要重写或强制转换表达式。
位置:123

共有1个答案

淳于鹏
2023-03-14

只需将其映射为JSONode就可以工作了。因此,从string,您需要构建JacksonJsonNode

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

 类似资料:
  • 问题内容: 我正在尝试这样做,但是不起作用: 我应该如何正确地做到这一点? 问题答案: 您不能,因为基元不是对象。 您目前正在尝试的还没有实例化- 它正在加载一个类。但是您不能对原始对象执行此操作。确实是用于类型的名称,无论何时获取其对象(例如,通过反射),但您都无法使用加载它。 参考:反射教程: 如果一个类的全限定名称可用,则可以使用静态方法Class.forName()获得相应的Class。

  • 问题内容: 有没有办法从获取原始/原始JSON值? 问题: 现在是,但是我需要原始字符串。 有没有办法获得这个原始价值?另外,我无法更改创建方式(例如更改设置),因为它作为参数传递给我的课程… (参考:原始的NJsonSchema问题) 问题答案: 您无法获取原始字符串,无法识别日期字符串并将其转换为自身内部的结构。如果您这样做,则可以看到以下内容: 但是,您可以通过执行以下操作以ISO 8601

  • 我有一个Spring Cloud Stream(SCS)Kafka制作应用程序,配置了Sleuth进行跟踪。我正在尝试发布一个spring消息“GenericMessage”(即MessageHeaders负载),它需要由以下两个用户使用: SCS消费者(应继续自动添加到MessageHeaders的跟踪) headerMode=embeddedHeaders(默认设置):消息头中的跟踪条目在消息

  • 本文向大家介绍JSON Web Tokens的实现原理,包括了JSON Web Tokens的实现原理的使用技巧和注意事项,需要的朋友参考一下 前言 最近在做一个Python项目的改造,将python项目重构为Java项目,过程中遇到了这个知识点,觉得这个蛮实用的,所以下班后回来趁热打铁写下这篇总结,希望后面的人能够有所借鉴,少走弯路。 一、优势简介 JSON Web Tokens简称jwt,是r

  • 1. 前言 在正式的小节学习之前,我们先来探讨一个问题,你究竟是否有必要使用类似于MongoDB这样的文档性数据库? 这些年,NoSQL以及NewSQL都刮起过一番浪潮,而SQL终究还是岿然不动,不仅没有被打垮,反而变得更加大。PostgreSQL号称世界上最先进的关系数据库,很早的时候便已经开始支持文档性数据类型了,而且在9.3以后的每一个版本,都提供了更多的新特性。 PostgreSQL 最重

  • 我的Rest控制器 我的异常处理无效的原始 json 帖子。我尝试使用请求。 IllegalStateException:已经为此请求调用了getInputStream() 我想在这个异常上保留日志输入原始json数据。 有人能帮我吗?谢谢。 更新 作为@Sean Carrol的建议。我尝试按照建议使用HttpServletRequest estWrapper,但它仍然不起作用。 我在InputS