Запрос select с внутренним объединением 3 таблиц и предложением where

#mysql #hibernate #spring-data-jpa

#mysql #переход в спящий режим #spring-data-jpa

Вопрос:

я хочу выбрать данные из таблицы users с помощью внутренней таблицы join users_role роли внутренней таблицы join с предложением where, но при сборке приложения возникла ошибка

 @Query(value = "select u from users u join users_role ur on u.id = ur.user_id join roles r on ur.role_id = r.id where r.role = 'ROLE_PL' ")
List<User> findPersonels();
  
 [ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 8.287 s <<< FAILURE! - in com.backend.AuthentificationJwtApplicationTests
[ERROR] contextLoads(com.backend.AuthentificationJwtApplicationTests)  Time elapsed: 0.004 s  <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'personnelController': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personnelRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.backend.repository.PersonnelRepository.findPersonels()!
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personnelRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.backend.repository.PersonnelRepository.findPersonels()!
Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.backend.repository.PersonnelRepository.findPersonels()!
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [select u from users u join users_role ur on u.id = ur.user_id join roles r on ur.role_id = r.id where r.role = 'ROLE_PL' ]
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [select u from users u join users_role ur on u.id = ur.user_id join roles r on ur.role_id = r.id where r.role = 'ROLE_PL' ]
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped
  

Комментарии:

1. Изменить select u from с помощью select u.* from

2. что ж, @ forpas, я попробовал это непосредственно в своей базе данных (sql), и это сработало, но когда я вставил это в «Query», это выдает мне ошибку о » *», а изменил его на u.id и затем выдал мне ту же ошибку «пользователи не сопоставлены»

3. Query ожидает запрос JPQL . JPQL — это не SQL. Это другой язык. Он работает не с таблицами и именами столбцов, а с сущностями, их свойствами и их ассоциациями. Прочитайте документацию, чтобы изучить ее: docs.jboss.org/hibernate/orm/current/userguide/html_single /…

Ответ №1:

Похоже, что ваш запрос не относится ни к JPQL ( users не является сущностью), ни к SQL (вы не можете select <table alias> from ... использовать SQL).

Выберите один из двух, и если вы выберете SQL, добавьте nativeQuery=true в @Query аннотацию.