2013-04-08 2 views
2

Я пишу приложение Java с использованием Hibernate и IBM DB2 9.7 LUW для базы данных. Я использую SQLQuery API для чтения пользовательской строки запроса SQL и выполняю ее против БД. Запрос содержит псевдонимы, то есть SELECT WORK.EMPLOYEE AS WORKEMPLOYEE, как пример.Задача с получением правильных сопоставлений для псевдонимов с использованием Java + Hibernate + DB2

При извлечении результирующего набора из БД командой list() результат map не содержит псевдоним в качестве ключа. Так пишет map.containsKey("WORKEMPLOYEE")false. Я также попытался использовать query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE), но это не изменило ситуацию.

ответ

0

Я не знаю Hibernate, но я подозреваю, что это симптом проблемы, которую мы видели относительно DB2 LUW и псевдонимов.

Это относится к различию между «именем» столбца и его «меткой». IBM документирует поведение в this page, что говорит о том, что поведение будет отличаться от разных версий драйвера базы данных.

В частности, этот пункт:

ли столбец в списке выбора запроса имеет пункт AS. Для драйверов JDBC перед драйвером IBM Data Server для JDBC и SQLJ версии 4.0, если столбец в списке SELECT запроса содержит предложение AS, ResultSetMetaData.getColumnNamereturns аргумент предложения AS. В драйвере IBM Data Server для JDBC и SQLJ версии 4.0 ResultSetMetaData.getColumnNamereturns имя столбца таблицы.

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

Существует три возможных решения, ни одна из которых не является полностью удовлетворительной.

  1. Используйте драйвер версии 3.x.
  2. Вы можете переключиться на вызов getColumnLabel на ResultSetMetaData. Это даст вам правильный результат с DB2 LUW с использованием драйверов версии 4+. Это относится к нашей версии проблемы, но может быть не актуальной или возможной с помощью Hibernate.
  3. Существует свойство, которое вы можете установить на объекте DataSource или Connection: useJDBC4ColumnNameAndLabelSemantics необходимо установить на DB2BaseDataSource.NO. Однако я не знаю, можете ли вы установить это через Hibernate. Если вы можете, это должно привести к тому, что псевдонимы будут вести себя старым (и надлежащим образом) способом.

В нашей среде мы еще не решили, как лучше справиться с этим. Мы работаем над этим, используя вариант 1 на данный момент. Я склонен использовать вариант 2, но мы должны поддерживать несколько платформ БД, и я не уверен, как он будет работать с другими. Для варианта 3 мы поем Spring, поэтому может быть нецелесообразно устанавливать это свойство.

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

  • Нет связанных вопросов^_^