Java getMetaData () или getString () не прослушивает псевдонимы в запросе SQL

Функция getMetaData () или getString () не прослушивает псевдонимы, указанные в моем SQL-запросе. Запрос SQL выполняется успешно.

Это часть моего запроса: SELECT o.id as o_id, o.package_id as o_package_id, o.client_id as o_client_id, o.reciever_id as o_reciever_id,

resultSet.getString(fieldname) работает только с id, package_id, client_id и т. д., Он не работает с o.id, o.package_id, o.client_id или именами полей, которые я дал им в запросе o_id, o_package_id, o_client_id.

Это вызывает проблему, у меня есть запрос с несколькими JOIN с двойными именами полей.

Как я могу получать данные по псевдонимам?

Какая база данных и драйвер? Конечно, вы всегда можете получить по позиционному атрибуту.

Kayaman 15.05.2018 15:18
o.id не может работать как имя столбца, потому что столбец по-прежнему называется id. Работает ли JDBC Водитель (не "Java") с псевдонимом столбца, зависит от Водитель (а иногда и от драйвера версия)
a_horse_with_no_name 15.05.2018 15:21

@Kayaman InnoDB, JConnector 5.1

Jon 15.05.2018 15:22

Используйте ResultSetMetadata.getColumnLabel, чтобы проверить возвращаемое "имя" столбца. Это будет псевдоним или имя столбца, если не указан псевдоним (AS), как определено в javadoc. И для информации в документации указано, что ResultSet.getString(String) будет использовать метку (то есть псевдоним, если он указан) для получения правильного столбца. Так что, если InnoDB не реализовал интерфейс полностью, это должно быть нормально.

AxelH 15.05.2018 15:36

Пожалуйста, покажите код, который вы используете. Как указывает AxelH, вы, вероятно, используете getColumnName вместо getColumnLabel. Значения извлекаются из набора результатов по метке столбца (!), А не по имени столбца.

Mark Rotteveel 15.05.2018 15:40

Спасибо, @AxelH. getColumnLabel () не предоставляет никаких псевдонимов ... он возвращает все имена столбцов по умолчанию.

Jon 15.05.2018 15:44

@MarkRotteveel Я использую getString() для получения данных, я не использую getColumnName() или getColumnLabel(). У меня уже есть названия / метки столбцов

Jon 15.05.2018 15:47

Пожалуйста, предоставьте отрывок вашего кода. Этого не должно происходить (если JConnector правильно реализует интерфейс ResultSet). Обратите внимание, что ResultSet будет использовать ResultSetMetaData для получения индекса имени столбца. Поэтому, если ResultSetMetadata.getColumnLabel не показывает правильное имя, вы вообще не можете использовать псевдоним. Как было сказано ранее, вы все равно можете использовать вместо него индекс.

AxelH 15.05.2018 15:48

@axeH Я уже пробовал ResultSetMetadata.getColumnLabel. См. Мой предыдущий комментарий. Он не предоставляет никаких псевдонимов. Я не могу использовать индекс, как я сказал ранее: «Это вызывает проблему, у меня есть запрос с несколькими JOIN с двойными именами полей». Вот отрывок из моего кода: DBWrapper DBWrapper = new DBWrapper(); DBWrapper.initialize(); ResultSet resultSet = DBWrapper.executeQuery(query); System.out.println(resultSet.getString("co_rp_name")));

Jon 15.05.2018 16:07

Пожалуйста, разместите весь соответствующий код в вашем вопросе. Размещение его в комментариях делает его нечитаемым, также учтите, что показанный запрос не содержит столбца с псевдонимом co_rp_name, поэтому получить такой столбец будет невозможно. До сих пор вам не удалось опубликовать воспроизводимый код, и вы не указали такие вещи, как версия точный драйвера MySQL Connector / J и MySQL, которые вы используете.

Mark Rotteveel 15.05.2018 16:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это как-то связано с JConnector. заставить URL-адрес драйвера использовать useOldAliasMetadataBehavior как true (который имеет значение по умолчанию false в v5.1.6)

Должно получиться так:

url = "jdbc:mysql://localhost:3306/mydb?useOldAliasMetadataBehavior=true"

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