我的PostgreSQL数据库(9.2)中有一个表,其中的列类型为JSON。我很难将此列映射到“ JPA2实体”字段类型。
我尝试使用String,但是当我保存实体时,出现一个异常,即它无法将字符转换为JSON。
处理JSON列时使用的正确值类型是什么?
@Entity public class MyEntity { private String jsonPayload; // this maps to a json column public MyEntity() { } }
一个简单的解决方法是定义一个文本列。
请参阅PgJDBC错误#265。
PostgreSQL过于严格,对数据类型转换非常严格。它text甚至不会隐式转换为像xml和这样的文本值json。
text
xml
json
解决此问题的严格正确方法是编写一个使用JDBC setObject方法的自定义Hibernate映射类型。这可能有点麻烦,因此您可能只想通过创建较弱的强制转换来使PostgreSQL的严格性降低。
setObject
正如@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它可以转换而无需明确地告诉它,从而允许这样的事情起作用:
AS IMPLICIT
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指出问题。