Задача получения правильных сопоставлений для псевдонимов с использованием Java+Hibernate+DB2

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

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

1 ответ

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

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

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

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

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

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

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

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

Другие вопросы по тегам