2013-04-12 2 views
4

ранее я задал следующий вопрос: DB2 query Unknown column name ERRORCODE=-4460, SQLSTATE=nulldb2jcc4.jar Недопустимый параметр: Неизвестное имя столбца

С тех пор мы узнали, что переход от db2jcc4.jar (ОКК) от db2jcc.jar (UNIVERSAL) решает эту проблему в нашем среда разработки. Проблема в том, что одна из них не является новой. Мы не хотим отступать назад от нашего водителя, не имея действительно хорошей причины. Но причина, по которой запрос в приведенной выше ссылке недействителен в новом драйвере, не понимается мной.

Мы знаем, что это тот столбец ... если мы выведем его из результатов, запустив пустое пространство, все будет работать (за исключением того, что мы не получаем данные). Запрос отлично работает в других средах.

Я видел несколько сообщений, предполагающих, что эта ошибка связана с тем, что метаданные результата getColumn() несовместимы между JDBC3 и JDBC4. Но мы не делаем ничего особенного в этом запросе, который не выполняется во многих других запросах, по крайней мере, не так далеко, насколько мы можем судить.

Кто-нибудь знает, что с этим вопросом может быть отключено? Есть ли исправление для этого поведения ... либо настройка, либо обходной путь, либо новый драйвер?

Полное исключение:

com.ibm.db2.jcc.a.SqlException: [СТК] [10150] [10300] [4.3.111] Недопустимый параметр: Unknown> Имя столбца FILTER_VALUE_DECODE. ERRORCODE = -4460, SQLSTATE = null at com.ibm.db2.jcc.a.dd.a (dd.java:660) at com.ibm.db2.jcc.a.dd.a (dd.java: 60) на com.ibm.db2.jcc.a.dd.a (dd.java:103) на com.ibm.db2.jcc.a.ib.a (ib.java:1674) на com. ibm.db2.jcc.a.yl.a (yl.java:1625) at com.ibm.db2.jcc.a.yl.getString (yl.java:1468) at com.ibm.ws.rsadapter. jdbc.WSJdbcResultSet.getString (WSJdbcResultSet.java:2467) на org.hibernate.type.StringType.get (StringType.java:41) на org.hibernate.type.NullableType.nullSafeGet (NullableType.java:184) на org.hibernate.type.NullableType.nullSafeGet (NullableType.java:210) at org.hibernate.loader.custom.CustomLoader $ ScalarResultColumnProcessor.extract (Cus tomLoader.java:501) в org.hibernate.loader.custom.CustomLoader $ ResultRowProcessor.buildResultRow (CustomLoader.java:447) в org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow (CustomLoader.java:344) в org.hibernate.loader.Loader.getRowFromResultSet (Loader.java:647) at org.hibernate.loader.Loader.doQuery (Loader.java:745) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections (Loader.java: 270) на org.hibernate.loader.Loader.doList (Loader.java:2294) ... 64 более

+0

Если вы решили старый вопрос, отправьте ответ, если у кого-то еще должна быть аналогичная проблема. – WarrenT

+0

Я предполагаю, что вы используете 'columnName' вместо' columnLabel' для извлечения значения из набора результатов. –

+0

@WarrenT - Нет, это более подробно/повторное задание этой проблемы. Ответ Марка выглядит многообещающим. Я собираюсь попробовать это. – user1187719

ответ

5

Вы, вероятно, с помощью Hibernate 3.x. Hibernate 3.x пытается получить значения столбцов по их columnName (то есть свойство ResultSetMetaData для исходного имени столбца), тогда как JDBC требует (по спецификации), чтобы они были получены columnLabel (свойство для псевдонима AS или если это не указано в исходном столбце).

Старые версии JDBC были не совсем понятно, о различии между columnName и columnLabel, поэтому реализация драйверов либо возвращается одинаковое значение для обоих свойств, или ожидали columnName для получения значений.

IBM изменила это поведение, чтобы соответствовать спецификации JDBC в драйвере DB2 9.5, см. this document. Чтобы вернуться к старому поведению, необходимо указать свойство соединения useJDBC4ColumnNameAndLabelSemantics в DB2BaseDataSource.NO (который имеет значение 2):

Разрешение
Если вы не можете изменить свои приложения, чтобы соответствовать новому ResultSetMetaData поведения, но вам нужны другие функции JDBC 4.0, установите для свойства Connection или DataSource значение DB2BaseDataSource.NO (2), чтобы сохранить прежнее поведение.

Другой вариант заключается в обновлении до новой версии Hibernate (4.x), так как это (по крайней мере, по умолчанию) использует columnLabel для извлечения значений.

+0

Это было сделано. Благодарю. – user1187719

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