如何通过PreparedStatement
添加PostgreSQL复合类型?
复合类型是:
CREATE TYPE fullcontact AS (address address,contacts contact);
ALTER TYPE fullcontact OWNER TO postgres;
COMMENT ON TYPE fullcontact IS 'Describe a type for a contact info with phone, email, and address';
我想通过
添加它FullContact fc = (FullContact)value;
PGobject pgObj = castToPGObject(fc);
PreparedStatement st = [this is a reference i obtain from a method];
st.setObject(index,pgObj);
castToPGObject
将FullContact
实例转换为ROW格式。这是一个实例转换的结果:
ROW(ROW('Italy','Country',null,10,'1202'),ROW('email','aPhone','aMobile',null))
与INSERT一起使用它就像魅力一样,但当我尝试使用PreparedStatement
时,它失败了。
我查看了JDBC驱动程序的代码,似乎不支持STRUCT类型的PostgreSQL。我错过了什么吗?
从setObject
我获得了PreparedStatement
而不是正确的转化'
。例如,我取代上面的ROW:
'ROW(ROW(''Italy'',''Country'',null,10,''1202''),ROW(''email'',''aPhone'',''aMobile'',null))'
这失败了,因为它不再被认为是一个结构。我也尝试过添加
st.setEscapeProcessing(false);
但仍然添加'
。我需要使用PreparedStatement
,因为在定义自定义用户类型时我在Hibernate中遇到了问题
我正在考虑加入JDBC Driver项目以尝试添加对STRUCT对象的支持。
答案 0 :(得分:1)
行构造函数ROW()
是PostgreSQL 函数调用。您需要传递值 - 或者确切地说:表示复合类型的字符串文字。
试试这个语法:
SELECT '("(Italy,""Country with space"",,10,1202)"
,"(email,aPhone,aMobile,)")'::fullcontact
所以你的价值是:
("(Italy,""Country with space"",,10,1202)","(email,aPhone,aMobile,)")
我输入'Country with space'来演示带有特殊字符的语法 阅读有关composite value input in the manual。
的详细信息