Проблема с PreparedStatement, который использует объединение запроса select и IN CLAUSE - PullRequest
0 голосов
/ 08 апреля 2011

Я написал запрос в форме:

select .... where x.y in (?) union select .... where p.y in (?) and a.b not in (?) 

Знаки вопроса указывают места, в которые я помещаю несколько значений во время выполнения (динамически помещая значения в предложение IN) с использованием метода prepareStatement.setString ().

Набор результатов при выполнении этого запроса, похоже, игнорирует запрос после предложения union.Я нигде не получаю никаких исключений.

Я отправляю этот вопрос, просто чтобы узнать, сталкивался ли кто-либо еще с такой проблемой, как эта ссылка предполагает СОЕДИНЕНИЕ нескольких таблиц и подготовленного заявления не работает База данныхOracle 10g, в случае, если это имеет значение.

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

Вы можете использовать только «?»оператор для отдельных значений .Используя строку для установки значения IN, вы получите ...

SELECT * FROM TABLE WHERE ID IN (?)

... будет считаться ...

SELECT * FROM TABLE WHERE ID IN ("1,2,3,4")

... в вашем случае.

Если вы используете «Вариант 2» из ссылки JavaRanch, это будет выглядеть так:

SELECT * FROM TABLE WHERE ID IN (1, 2, 3, 4)

... что, я считаю, то, что вы хотите, НО вам нужно всегда указывать ровно 4 значения.Если у вас их меньше, вы, конечно, можете использовать один из них снова без какого-либо вреда, но если у вас их больше, вам не повезло.

Я бы порекомендовал вам сделать это динамически создать PreparedStatement.с таким количеством '?'как у вас есть в-параметры, а затем перебрать и установить их.Таким образом, вы комбинируете необходимость динамического запроса с очисткой ввода, избегая любых атак SQL-инъекций.

1 голос
/ 08 апреля 2011

Насколько я помню - вы не можете использовать ? для оператора in - но union поддерживается нормально.

Вы пытались заменить in на =?Или удалить union и проверить, решает ли это проблему?

...