请参阅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 TABLEregress=# PREPARE test(text) AS INSERT INTO jsontext(x) VALUES ($1);PREPAREregress=# EXECUTE test('{}')INSERT 0 1感谢@markdsievers指出问题。



