具有Postgresql xml类型的QueryDSL/Talend JDBC:SQL插入或更新时更改的xml(算术计算) 大家好,
我被一个特别烦人的问题缠住了。它依赖于通过JDBC将xml内容插入或更新到Postgresql xml类型字段中 上下文 下表的结构如下:具有Postgresql xml类型的QueryDSL/Talend JDBC:SQL插入或更新时更改的xml(算术计算) 大家好,,xml,postgresql,jdbc,xml-parsing,querydsl,Xml,Postgresql,Jdbc,Xml Parsing,Querydsl,我被一个特别烦人的问题缠住了。它依赖于通过JDBC将xml内容插入或更新到Postgresql xml类型字段中 上下文 下表的结构如下: CREATE TABLE articles ( article_id integer NOT NULL, article_xml xml NOT NULL ); 我使用QueryDSL库在应用程序中构建SQL查询,但初始数据来自OpenLink Virtuoso服务器,该服务器已使用Talend进行迁移,因此基于JDBC的事务也是如此 示例
CREATE TABLE articles (
article_id integer NOT NULL,
article_xml xml NOT NULL
);
我使用QueryDSL库在应用程序中构建SQL查询,但初始数据来自OpenLink Virtuoso服务器,该服务器已使用Talend进行迁移,因此基于JDBC的事务也是如此
示例XML是:
<?xml version="1.0" encoding="UTF-8" ?>
<ArticleSimple>
<id>22754</id>
<departement>64 / 56</departement>
</ArticleSimple>
update "Shared"."articles"
set "article_xml" = xml '[xml value]',
where "articles"."article_id" = 22754
我还尝试了其他synthaxes来获取XML值,但没有成功解决我的问题:
no expression at all just the xml value
XMLPARSE (DOCUMENT '[xml value]')
XMLPARSE (CONTENT '[xml value]')
'[xml value]'::xml
此外,所有这些synthaxes都在phpPgAdmin或PgAdmin中工作
在java中,示例QueryDSL UpdateClause:
SQLUpdateClause clause = buildUpdate(connection, articles)
.where(articles.articleId.eq(articleID))
.set(articles.articleXml, xml([xml value]));
其中xml函数定义如下:
protected static StringExpression xml(String xml)
{
return StringTemplate.create("xml {0}", xml);
}
我使用的JDBC驱动程序版本是:postgresql-9.1-903.jdbc4
问题
首先也是最重要的一点,当我直接在phpPgAdmin或PgAdmin中执行查询时,不会发生任何问题,因为问题必须出现在另一层,可能是JDBC
在某种程度上,xml会根据提供的示例进行更改并转换为该输出:
<?xml version="1.0" encoding="UTF-8" ?>
<ArticleSimple>
<id>22754</id>
<departement>1,142857142857143</departement>
</ArticleSimple>
对于QueryDSL,我可以说在SqlUpdateCase构造之前,xml输入没有改变,之后当我为SqlUpdateCase打印SQL时,xml值会改变:
update "Shared"."articles"
set "article_xml" = xml '<ArticleSimple><id>22754</id><departement>1,142857142857143</departement></ArticleSimple>'
where "articles"."article_id" = 22754
问题
我想知道是否有人已经遇到了类似的问题并找到了转机,或者是否有人有任何线索
提前感谢那些将阅读我的帖子并提出任何建议或解决方案的人 因此,您的查询生成器在进入PostgreSQL之前就已经损坏了SQL。您是否在准备语句中使用位置参数?对于talend,情况是这样的,它是隐式的,但据我所知,它在准备语句中使用位置参数。对于QueryDsl,我不知道底层流程,但它基于JBDC,所以我也会说是。您是如何打印QueryDsl查询的?对于SQLInsertClause和SQLUpdateClause,我使用toString方法,因为我没有找到任何类似于getSQL…getSQL的东西,可用于SQLQuery。我错了吗?
update "Shared"."articles"
set "article_xml" = xml '<ArticleSimple><id>22754</id><departement>1,142857142857143</departement></ArticleSimple>'
where "articles"."article_id" = 22754