2015-11-15 3 views
0

В принципе, это должно выполняться одним запросом, считываться во всех значениях из одного столбца и затем запускать некоторые другие запросы, основанные на этих значениях. Он превращает значения в массив целых чисел и передает его в качестве параметра для операторов для других запросов, но когда они выполняются, он выдает «синтаксическую ошибку в точке или рядом с« 1 ». Позиция: 87»Ошибка синтаксиса запроса запроса JDBC

Пример запросы:

"SELECT foo.id, bar.* " 
+ "FROM foo, bar y " 
+ "WHERE foo.baz = bar.baz and foo.id IN ? " 
+ "GROUP BY foo.id"; 

И параметр устанавливающих бит (результат является ArrayList из данных столбца):

Integer[] data = result.toArray(new Integer[result.size()]); 
    Array array = connection.createArrayOf("INTEGER", data); 

    statement.clearParameters(); 
    statement.setArray(1, array); 

(код, потому что это обобщенный для домашнего задания)

ответ

3

Оператор IN требует использования списка выражений, заключенных между круглыми скобками: in (1,2,3). A ? владелец места может использоваться только для одного скалярного значения (числа, строки).

Если вы хотите передать список идентификаторов в качестве массива вы должны изменить SQL таким образом, что владелец места «принимает» массив:

SELECT foo.id, bar.* 
FROM foo 
    JOIN bar y ON foo.baz = bar.baz 
WHERE and foo.id = ANY (?) 
GROUP BY foo.id 

Обратите внимание, что я также изменил старый стиль неявным присоединитесь к статье WHERE к современному явному JOIN (но это не имеет значения для вашего вопроса).

С помощью приведенного выше синтаксиса вы можете передать массив со списком идентификаторов.

Следующая проблема, которую вы получите, заключается в том, что "INTEGER" не является допустимым типом данных в Postgres. Имя типа передается «как есть», а типы данных в нижнем регистре Postgres. Таким образом, вы должны использовать:

Array array = connection.createArrayOf("integer", data); 

В принципе, что это предполагается сделать, это запустить один запрос, читать все значения из одного столбца, а затем выполнить некоторые другие запросы, основанные прочь те значения

Почему бы вам не сделать это в одном заявлении?

SELECT foo.id, bar.* 
FROM foo 
    JOIN bar y ON foo.baz = bar.baz 
WHERE and foo.id IN (SELECT some_column FROM ...) --<< this is your "first query" 
GROUP BY foo.id 

Это почти всегда лучше, чем запуск двух отдельных операторов.


Unrelated:

group by foo.id кажется ненужным, поскольку вы не используете никаких агрегатных функций. И это не сработает, если foo.id не является основным ключом таблицы foo.

+0

Спецификация типа массива в JDBC - это такой болезненный надзор. Там 'java.sql.Types', но по какой-то причине они решили вместо этого использовать произвольные строки для массивов. WTF? –

+0

@CraigRinger: Я предполагаю, что это потому, что вряд ли будет поддерживаться массив СУБД. Фактически Postgres - единственный, кого я знаю. –

+0

Спасибо за помощь! И да, это странный способ сделать это, но в задании было поручено, чтобы это были отдельные запросы.Думаю, идея состоит в том, что нам нужно научиться манипулировать данными на уровне приложений? –

Смежные вопросы