JDBC PreparedStatement: как добавить составной тип - PullRequest
1 голос
/ 16 марта 2012

Как добавить составной тип PostgreSQL с помощью PreparedStatement?
Составной тип:

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, и кажется, что тип STRGT PostgreSQL не поддерживается.Я что-то упускаю?

С setObject Я получаю, что вместо правильного преобразования PreparedStatement добавляет ', где это не должно быть.Например, вместо строки, указанной выше, я получаю:

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

И это терпит неудачу, потому что оно больше не распознается как структура.Я попытался также, добавив

st.setEscapeProcessing(false);

, но ' все еще добавляются.Мне нужно использовать PreparedStatement из-за проблемы, с которой я столкнулся в Hibernate при определении пользовательского типа.
Я думаю о присоединении к проекту драйвера JDBC, чтобы попытаться добавить поддержку объекта STRUCT.

1 Ответ

1 голос
/ 17 марта 2012

Конструктор строки ROW() является вызовом функции PostgreSQL .Вам нужно передать значение - или, если быть точным: строковый литерал, представляющий составной тип.

Попробуйте этот синтаксис:

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

Таким образом, ваше значение будет:

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

Я указал «Страна с пробелом», чтобы продемонстрировать синтаксис со специальными символами.
Прочтите подробности о вводе составного значения в руководстве .

...