【问题标题】:JDBC PreparedStatement: How to add a Composite TypeJDBC PreparedStatement:如何添加复合类型
【发布时间】:2012-04-01 22:10:58
【问题描述】:

如何通过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 驱动程序的代码,似乎不支持 PostgreSQL 的 STRUCT 类型。我错过了什么吗?

setObject 我得到,而不是正确的转换PreparedStatement 在不应该的地方添加'。例如,我得到的不是上面的 ROW:

'ROW(ROW(''Italy'',''Country'',null,10,''1202''),ROW(''email'',''aPhone'',''aMobile'',null))'

这失败了,因为它不再被识别为结构。我也尝试过添加

st.setEscapeProcessing(false);

' 仍被添加。我需要使用PreparedStatement,因为在定义自定义用户类型时我在 Hibernate 中遇到了问题。
我正在考虑加入 JDBC Driver 项目以尝试添加对 STRUCT 对象的支持。

【问题讨论】:

    标签: hibernate postgresql jdbc prepared-statement composite-types


    【解决方案1】:

    行构造函数ROW() 是一个PostgreSQL 函数调用。您需要传递一个 - 或者更准确地说:表示复合类型的字符串字面量。

    试试这个语法:

    SELECT '("(Italy,""Country with space"",,10,1202)"
            ,"(email,aPhone,aMobile,)")'::fullcontact
    

    所以你的价值是:

    ("(Italy,""Country with space"",,10,1202)","(email,aPhone,aMobile,)")
    

    我输入了“带空格的国家/地区”来演示特殊字符的语法。
    阅读有关composite value input in the manual 的详细信息。

    【讨论】:

    • 对不起...问题不在于 SQL 本身,而在于使用准备好的语句,它没有让我有机会设置结构类型...我的意思是当我添加发生转义的正确字符串给了我错误的结果,我报告了我的问题...周一我将尝试发布一个完整的示例...但是感谢您的支持和您对语言的更正;-)
    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 2013-11-14
    • 2013-11-28
    • 2013-01-12
    • 2016-01-28
    • 2016-06-02
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多