将PostgreSQL JSON列映射到Hibernate值类型
我的PostgreSQL数据库(9.2)中有一个表,其中的列类型为JSON。我很难将此列映射到“ JPA2实体”字段类型。
我尝试使用String,但是当我保存实体时,出现一个异常,即它无法将字符转换为JSON。
处理JSON列时使用的正确值类型是什么?
@Entity
public class MyEntity {
private String jsonPayload; // this maps to a json column
public MyEntity() {
}
}
一个简单的解决方法是定义一个文本列。
-
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指出问题。