将PostgreSQL JSON列映射到Hibernate实体属性

发布于 2021-01-31 17:31:54

我的PostgreSQL数据库(9.2)中有一个表,其中的列类型为JSON。我很难将此列映射到“ JPA2实体”字段类型。

我尝试使用String,但是当我保存实体时,出现一个异常,即它无法将字符转换为JSON。

处理JSON列时使用的正确值类型是什么?

@Entity
public class MyEntity {

    private String jsonPayload; // this maps to a json column

    public MyEntity() {
    }
}

一个简单的解决方法是定义一个文本列。

关注者
0
被浏览
91
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    请参阅PgJDBC错误#265

    PostgreSQL过于严格,对数据类型转换非常严格。它text甚至不会隐式转换为像xml和这样的文本值json

    解决此问题的严格正确方法是编写一个使用JDBC
    setObject方法的自定义Hibernate映射类型。这可能有点麻烦,因此您可能只想通过创建较弱的强制转换来使PostgreSQL的严格性降低。

    正如@markdsievers在评论和本博文中指出的那样,此答案中的原始解决方案绕过了JSON验证。因此,这并不是您真正想要的。写起来更安全:

    CREATE OR REPLACE FUNCTION json_intext(text) RETURNS json AS $$
    SELECT json_in($1::cstring); 
    $$ LANGUAGE SQL IMMUTABLE;
    
    CREATE CAST (text AS json) WITH FUNCTION json_intext(text) AS IMPLICIT;
    

    AS IMPLICIT 告诉PostgreSQL它可以转换而无需明确地告诉它,从而允许这样的事情起作用:

    regress=# CREATE TABLE jsontext(x json);
    CREATE TABLE
    regress=# PREPARE test(text) AS INSERT INTO jsontext(x) VALUES ($1);
    PREPARE
    regress=# EXECUTE test('{}')
    INSERT 0 1
    

    感谢@markdsievers指出问题。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看