MYSQL Ошибка левого соединения с "неизвестным столбцом" в java - PullRequest
0 голосов
/ 06 марта 2020

У меня есть приложение Spring Boot, работающее с Spring boot 2.2.5, mysql -connector- java версия 5.1.38

В моем приложении у меня есть следующий запрос:

SELECT
  role.id AS roleid,
  roles.id,
  role_name,
  role_description,
  contact_name,
  roles.employee_mail,
  contact_phone
FROM
  rcsa.fs_role AS ROLE
  LEFT JOIN rcsa.fs_customer_roles_external AS roles
    ON roles.fs_role_id = role.id AND fs_customer_id = :account
  LEFT JOIN rcsa.fs_business_service_contacts AS cont
    ON roles.employee_mail = cont.contact_email
WHERE role_type_id = 2
GROUP BY role.id,
  employee_mail

Когда я запускаю этот запрос в моей mysql консоли администратора, он возвращает следующий результат: Correct result

Что я хочу, чтобы он возвратил.

Однако, когда я пытаюсь выполнить этот запрос из моего загрузочного приложения Spring, возникает исключение:

PreparedStatementCallback; исключение без категории для SQLException для SQL [выберите role.id в качестве roleid, role.id, role_name, role_description, contact_name, role.employee_mail, contact_phone из rcsa.fs_role в качестве роли слева. и fs_customer_id =? оставьте присоединение к rcsa.fs_business_service_contacts в качестве контактов на contacts.contact_email = role.employee_mail, где role_type_id = 2 группируйте по role.id, employee_mail]; SQL состояние [S0022]; код ошибки [0]; Столбец contact_email не найден .; вложенное исключение: java. sql .SQLException: столбец 'contact_email' не найден

Я попытался поменять порядок столбцов во втором предложении on, но безрезультатно. Я предполагаю, что ошибка связана с порядком моих объединений, когда я начинаю с таблицы fs_role, но это сделано специально для того, чтобы все неназначенные роли также возвращались.

РЕДАКТИРОВАТЬ:

В моем оригинале вопрос, запросы не были идентичны, поскольку я экспериментировал, чтобы увидеть, смогу ли я найти решение, проблема все еще сохраняется, когда запросы идентичны.

РЕДАКТИРОВАТЬ 2:

Я включил mysql журнал транзакций и оба запроса присутствуют в нем:

Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                            Id  Command Argument
2020-03-06T12:39:15.942813Z     8   Query   SHOW GLOBAL STATUS
2020-03-06T12:39:18.568670Z     9   Query   SET autocommit=0
2020-03-06T12:39:18.569841Z     9   Query   select role.id as roleid, roles.id, role_name, role_description, contact_name, roles.employee_mail , contact_phone from rcsa.fs_role as role  
                                            left join rcsa.fs_customer_roles_external  as roles    on roles.fs_role_id=role.id and fs_customer_id=1010499  
                                            left join rcsa.fs_business_service_contacts as cont on roles.employee_mail=cont.contact_email  
                                         where role_type_id=2 group by role.id, employee_mail
2020-03-06T12:39:18.574042Z     9   Query   rollback
2020-03-06T12:39:18.574299Z     9   Query   SET autocommit=1
2020-03-06T12:39:18.952383Z     8   Query   SHOW GLOBAL STATUS
2020-03-06T12:39:20.048826Z     2   Query   select role.id as roleid, roles.id, role_name, role_description, contact_name, roles.employee_mail , contact_phone from rcsa.fs_role as role 
                                            left join rcsa.fs_customer_roles_external  as roles    on roles.fs_role_id=role.id and fs_customer_id=1010499 
                                            left join rcsa.fs_business_service_contacts as cont on roles.employee_mail=cont.contact_email 
                                            where role_type_id=2 group by role.id, employee_mail

Первый запрос происходит из моего кода java, а второй из моего mysql рабочего места.

Ответы [ 3 ]

0 голосов
/ 06 марта 2020

Это два разных запроса

select r.id role_id
     , e.id
     , role_name
     , role_description
     , contact_name
     , e.employee_mail 
     , contact_phone 
  from rcsa.fs_role r 
  left 
  join rcsa.fs_customer_roles_external e
    on e.fs_role_id = r.id 
  left 
  join rcsa.fs_business_service_contacts c
  on e.employee_mail = c.contact_email  
 where role_type_id = 2 

   and fs_customer_id = :account 

 group 
    by r.id
     , employee_mail

select r.id role_id
     , e.id
     , role_name
     , role_description
     , contact_name
     , e.employee_mail
     , contact_phone 
  from rcsa.fs_role r 
  left 
  join rcsa.fs_customer_roles_external e
    on e.fs_role_id = r.id 

   and fs_customer_id =? 

  left 
  join rcsa.fs_business_service_contacts c
    on c.contact_email = e.employee_mail  
 where role_type_id = 2 

 group 
    by role.id
     , employee_mail
0 голосов
/ 06 марта 2020

Получается, что ошибка была не с сервера MYSQL, а с приложения java. Я выбирал contact_email из набора результатов и заполнял объект этим, и именно здесь произошла ошибка.

0 голосов
/ 06 марта 2020

попробуйте использовать это для всех столбцов select role.id as roleid => select role.id as 'roleid'

...