JDBC PreparedStatement:如何添加复合类型

时间:2012-03-16 10:58:57

标签: hibernate postgresql jdbc prepared-statement compositetype

如何通过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);

castToPGObjectFullContact实例转换为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对象的支持。

1 个答案:

答案 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

的详细信息