DBUnit игнорирует псевдонимы столбцов при создании набора данных из запроса?

У меня есть два набора данных, которые я хочу сравнить с DBUnit: один определяется как файл XML, другой я пытаюсь создать с помощью запроса:

dbConnection.createQueryTable("my_table", "SELECT ...");

Выбор проходит через пару таблиц, где некоторые из них имеют одинаковые имена столбцов, поэтому я использую псевдонимы, чтобы различать их. Запрос выполняется нормально, но кажется, что при создании набора данных DBUnit игнорирует псевдонимы столбцов и вместо этого использует исходные имена. Это хорошо видно в журнале DEBUG:

01.03.13 14:18:43,228 [ DEBUG] AbstractDatabaseConnection - createQueryTable(resultName=my_table, sql=
        SELECT `table1`.`name`
            , `table2`.`label` AS `table2_label`
            , `table3`.`label`
        FROM `table1`
            , `table2`
            , `table3`
        WHERE `table1`.`id` = `table2`.`table1_id`
            AND `table2`.`id` = `table3`.`table2_id`
    ) - start
01.03.13 14:18:43,228 [ DEBUG] DatabaseDataSourceConnection - getConnection() - start
01.03.13 14:18:43,228 [ DEBUG] DatabaseConfig$Configurator - Statement fetch size set to 100
01.03.13 14:18:43,240 [ DEBUG] DatabaseDataSourceConnection - getConnection() - start
01.03.13 14:18:43,240 [ DEBUG] DatabaseTableMetaData - The 'schemaName' from the ResultSetMetaData is empty-string and not applicable hence. Will not try to lookup column properties via DatabaseMetaData.getColumns.
01.03.13 14:18:43,240 [ DEBUG] DatabaseTableMetaData - The 'schemaName' from the ResultSetMetaData is empty-string and not applicable hence. Will not try to lookup column properties via DatabaseMetaData.getColumns.
01.03.13 14:18:43,240 [ DEBUG] DatabaseTableMetaData - The 'schemaName' from the ResultSetMetaData is empty-string and not applicable hence. Will not try to lookup column properties via DatabaseMetaData.getColumns.
01.03.13 14:18:43,240 [ DEBUG] ForwardOnlyResultSetTable - getValue(row=0, columnName=name) - start
01.03.13 14:18:43,240 [ DEBUG] ForwardOnlyResultSetTable - getValue(row=0, columnName=label) - start
01.03.13 14:18:43,240 [ DEBUG] ForwardOnlyResultSetTable - getValue(row=0, columnName=label) - start
01.03.13 14:18:43,240 [ DEBUG] ForwardOnlyResultSetTable - getValue(row=1, columnName=name) - start
01.03.13 14:18:43,241 [ DEBUG] ForwardOnlyResultSetTable - getValue(row=1, columnName=label) - start
01.03.13 14:18:43,241 [ DEBUG] ForwardOnlyResultSetTable - getValue(row=1, columnName=label) - start
01.03.13 14:18:43,241 [ DEBUG] ForwardOnlyResultSetTable - getValue(row=2, columnName=name) - start
01.03.13 14:18:43,241 [ DEBUG] ForwardOnlyResultSetTable - getValue(row=2, columnName=label) - start
01.03.13 14:18:43,241 [ DEBUG] ForwardOnlyResultSetTable - getValue(row=2, columnName=label) - start

Как видите, getValue(row=X) использует label в качестве имени для столбцов table2 и table3, а не table2_label и label, как определено в запросе...

Как это решить? Я использую базу данных MySQL.


person Laimoncijus    schedule 01.03.2013    source источник


Ответы (1)


Похоже, это вызвано изменением в Java-коннекторе MYSQL.

Вызвано тем, что DatabaseTableMetaData позвонил ResultSetMetaData#getColumnName(), а не #getColumnLabel()

Вы не указываете, какую версию DBUnit/MySql вы используете, но на DBUnit 2.2 и 2.4.9 влияет коннектор MySql 5.1.26.

В качестве обходного пути разработчики MySQL включили опцию обратной совместимости, описанную выше.

Чтобы настроить его, добавьте свойство к URL-адресу JDBC:

jdbc:mysql://host/db_name?useOldAliasMetadataBehavior=true

Согласно этим инструкциям.

person Tim    schedule 16.10.2013
comment
Кстати, я использовал DBUnit 2.4.9 и MySQL Connector 5.1.26. - person Laimoncijus; 19.10.2013