PostgreSQL 对类似文本类型之间的隐式转换非常严格,例如json
, xml
, etc.
严格正确的解决方案是使用setObject(the_string, java.sql.Types.SQLXML)
使用 JDBC 设置参数时。这在 ORM 层中是很困难的,而且许多 ORM 似乎不能直接理解 SQL/XML 类型。
你可以告诉 PostgreSQL 允许来自text
to xml
通过修改系统目录隐式地进行。这并不理想,但它会起作用。
In psql
, 您可以使用\dC xml
将猫列出来xml
:
List of casts
Source type | Target type | Function | Implicit?
-------------------+-------------------+--------------------+---------------
character | xml | xml | no
character varying | xml | xml | no
text | xml | xml | no
xml | character | (binary coercible) | in assignment
xml | character varying | (binary coercible) | in assignment
xml | text | (binary coercible) | in assignment
(6 rows)
看到“隐式:否”了吗?
您需要使它们的分配可转换。因为它们是内置类型,所以你不能CREATE CAST
对于他们,您必须直接更新目录,更改pg_cast
table.
UPDATE pg_cast SET castcontext = 'a'
FROM pg_cast c
INNER JOIN pg_type srctype ON (c.castsource = srctype.oid)
INNER JOIN pg_type dsttype on (c.casttarget = dsttype.oid)
WHERE pg_cast.oid = c.oid
AND srctype.typname IN ('text','varchar')
AND dsttype.typname = 'xml';
弄乱系统目录可能会产生意想不到的效果。在这种情况下,我相信进行此更改是相当安全的,但它仍然会扰乱系统的内部结构。继续需要您自担风险。