PreparedStatement для атрибута Xpath - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть запрос с xpath.Значения в xpath заполняются динамически.

Запрос:

SELECT app_prof.pk_szid, app_prof.xmldata
FROM tblappprofile AS app_prof
WHERE 'Self' = 
CAST((xpath('/ApplicationProfile/ComponentIDs/ComponentID[@Family="Core"]/text()', xmldata))[1] AS TEXT)

Для readyStatement:

SELECT app_prof.pk_szid, app_prof.xmldata
FROM tblappprofile AS app_prof
WHERE ? = 
CAST((xpath('/ApplicationProfile/ComponentIDs/ComponentID[@Family= ? ]/text()', xmldata))[1] AS TEXT)

Когда я использую,

preparedStatement.setString(1, "Self");
preparedStatement.setString(2, "Core");

приводит к org.postgresql.util.PSQLException: The column index is out of range: 2, number of columns: 1

Поле «Я» заполнено правильно.? в атрибуте не распознан.Как использовать PreparedStatement для атрибутов в Xpath?

1 Ответ

0 голосов
/ 18 декабря 2018

Вопросительные знаки внутри строковых литералов не считаются заполнителями параметров.

Вам нужно передать все выражение XPath в качестве параметра:

WHERE ? = CAST((xpath(?, xmldata))[1] AS TEXT)

другой вариант - динамически создать строку с использованием функции format():

where ? = CAST((xpath(format('/ApplicationProfile/ComponentIDs/ComponentID[@Family="%s"]/text()',?), xmldata))[1]

Таким образом, вы можете передать значение для @Familiy в качестве параметра и при этом сохранить XPath внутри SQL, если хотите.

...