SQL Server/T-SQL через JSP: составной идентификатор XX.YY не может быть привязан

Я получаю сообщение об ошибке:

 the multi-part identifier "IC.industry" could not be bound

при выполнении этого SQL-запроса со страницы JSP через JDBC:

select C.company, C.shname, C.fullname, count(d_to_c.designer)
from companies C
     left join ind_to_c IC on C.company = IC.company
     left join d_to_c on C.company= d_to_c.company
where IC.industry = ?
group by C.company, C.shname, C.fullname
order by C.shname

и я пытаюсь запустить его как подготовленный оператор, где я устанавливаю параметр через (например) stmt.setObject(1, 7) перед запуском stmt.executeQuery().

Теперь, что странно: если я выполняю это с ? и устанавливаю параметр, как я только что упомянул, я получаю ошибку «невозможно связать». Однако если я просто изменю запрос и жестко запрограммирую число 7 в тексте запроса, это сработает!

Значит, он что-то связан с привязкой этого параметра.

Но я не могу понять, что.

Кто-нибудь?

ОБНОВЛЕНИЕ: по запросу определение таблицы для ind_to_c:

 industry - int(11)
 company - int(11)

(это просто таблица, определяющая отношения m2m между отраслями и компаниями)

ОБНОВЛЕНИЕ 2: Также по запросу полный код JSP. Мне пришлось вытащить это из вызова абстракции подключения к базе данных (которое мы используем для хранения подготовленных операторов и т. д.).

// conn был инициализирован как объект соединения с базой данных.

int parent_id = 7;
PreparedStatement ps = conn.prepareStatement("select C.company, C.shname, C.fullname, count(d_to_c.designer) from companies C left join ind_to_c IC on C.company = IC.company left join d_to_c on C.company = d_to_c.company where IC.industry = ? group by C.company, C.shname, C.fullname order by C.shname");
ps.setObject(1, parent_id);
ResultSet rs = null;
rs = ps.executeQuery();

person DanM    schedule 18.03.2009    source источник


Ответы (5)


Какой тип данных для промышленности? Есть ли разница, если вместо этого вы используете методы связывания, специфичные для типа, такие как stmt.setInt(1,7)?

изменить: также не относится к вопросу, но вам, вероятно, следует удалить C.cid из SELECT. Некоторые варианты T-SQL сделают вывод, что вы хотите выполнить группировку по этому столбцу, поскольку он не является предметом функции агрегирования, даже если вы не укажете его в предложении GROUP BY.

Возвращаясь к теме, можете ли вы опубликовать определение таблицы для ind_2_c? Природа ошибки, по-видимому, указывает на отсутствие столбца с именем industry.

person ninesided    schedule 18.03.2009
comment
на самом деле, я не могу это проверить — мне приходится работать через фреймворк (длинная история), который дает мне доступ только к setObject. Да, я понимаю, что это глупо. В любом случае, мне нужно использовать setObject. - person DanM; 19.03.2009
comment
(Кстати, Industrie — это int(11) - person DanM; 19.03.2009
comment
C.cid был опечаткой, как и ind_2_c (следовало читать ind_to_c). Я переименовал некоторые столбцы/таблицы для целей этого поста, отсюда и опечатки. Также выложил таблицу опр. - person DanM; 19.03.2009
comment
ааа, это имеет больше смысла, также вместо того, чтобы приводить код в порядок для нашей пользы, вы можете просто скопировать и вставить код для создания подготовленного оператора? - person ninesided; 19.03.2009

Пробовали ли вы передать именованный параметр (например, @industry) вместо вопросительного знака?

person Sam    schedule 18.03.2009
comment
Нет, как это сделать в контексте JSP/JDBC? Я попытался просто заменить заполнитель вопросительного знака на @industry, и, похоже, он вообще не распознал его как заполнитель. - person DanM; 18.03.2009

Может быть, я просто думаю, что здесь все просто, потому что я не очень хорошо знаю JSP, но это не просто сработает:

int parent_id = 7;
PreparedStatement ps = conn.prepareStatement("select C.company, C.shname, C.fullname, count(d_to_c.designer) from companies C left join ind_to_c IC on C.company = IC.company left join d_to_c on C.company = d_to_c.company where IC.industry = ? group by C.company, C.shname, C.fullname order by C.shname");

ps.setInt(1, parent_id );

ResultSet rs = null;
rs = ps.executeQuery();
person Coentje    schedule 19.03.2009

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

Но почему вы передаете массив объектов вместо одного объекта? (если я правильно читаю Java)

person devio    schedule 19.03.2009
comment
Я не знаю, это была опечатка... Я вытаскиваю весь этот код из структуры объекта, которую мы используем для хранения подготовленных stmts и других высокоуровневых вещей... и то, как мы передаем параметры этому framework через массив объектов. Случайно оставил его как массив вместо одного объекта. Ой! - person DanM; 19.03.2009
comment
(то есть код, который вы видите сейчас в вопросе, является правильным кодом, и у него все та же проблема.) - person DanM; 19.03.2009

Я обновился до более новой версии 2.0 драйвера MS-SQL JDBC, и волшебным образом это сработало.

person DanM    schedule 19.03.2009