Задача получения правильных сопоставлений для псевдонимов с использованием 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+.
Есть три возможных решения, ни одно из которых не является полностью удовлетворительным.
- Используйте драйвер версии 3.x.
- Вы можете переключиться на звонок
getColumnLabel
наResultSetMetaData
, Это даст вам правильный результат с DB2 LUW с использованием драйверов версии 4+. Это относится к нашей версии проблемы, но может быть неактуальным или невозможным через Hibernate. - Есть свойство, которое вы можете установить на
DataSource
или жеConnection
объект:useJDBC4ColumnNameAndLabelSemantics
должно быть установленоDB2BaseDataSource.NO
, Тем не менее, я не знаю, можете ли вы установить это через Hibernate. Если вы можете, псевдонимы должны вести себя по-старому (и правильно).
В нашей среде мы еще не определились с тем, как лучше всего с этим бороться. Мы работаем над этим, используя вариант 1 на данный момент. Я склонен использовать вариант 2, но мы должны поддерживать несколько платформ БД, и я не уверен, как это будет работать с другими. Для варианта 3 мы поем Spring, поэтому может быть нецелесообразно устанавливать это свойство.