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