一尘不染

将PostgreSQL JSON列映射到Hibernate值类型

hibernate

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

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

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

@Entity
public class MyEntity {

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

    public MyEntity() {
    }
}

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


阅读 211

收藏
2020-06-20

共1个答案

一尘不染

请参阅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指出问题。

2020-06-20