Я запускаю sql-запрос в своем приложении Springboot, чтобы заполнить всех пользователей, назначенных команде, но, к сожалению, он возвращает эту ошибку. Я подтвердил, что столбец существует, и попытался использовать псевдоним для * .team.id, но все еще получаю эту ошибку.

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

Любые идеи?

SQL-запрос из репозитория -

@Query(value = "SELECT * \n" +
        "FROM *.user u\n" 
        "INNER JOIN *.team t ON *.t.teamName = *.u.companyName\n" +
        "INNER JOIN *.team_user tu ON *.u.id = *.tu.userId\n" +
        "WHERE *.team_user.id = :id", nativeQuery = true)
List <User> getTeamUsers(long id);

Обслуживание -

public List<User> getTeamUsers(long id) {
    return teamRepository.getTeamUsers(id);
}

Контроллер -

@GetMapping(value = "/{id}/users")
public List<User> getTeamUsers(@PathVariable long id) {
    return teamService.getTeamUsers(id);
}

Структура команды

Структура пользователей команды

-1
DJD 8 Июн 2021 в 17:10

3 ответа

Лучший ответ

Что произойдет, если вы измените это на это:

@Query(value = "SELECT * " +
    "FROM user u " 
    "INNER JOIN team t ON (t.teamName = u.companyName) " +
    "INNER JOIN team_user tu ON (u.id = tu.userId) " +
    "WHERE tu.id = :id", nativeQuery = true)
List <User> getTeamUsers(@Param("id") long id);

?

0
crig 8 Июн 2021 в 14:33

Если вы получаете сообщение об ошибке: «Неизвестный столбец в предложении Where, это потому, что вы используете имя таблицы вместо псевдонима в предложении WHERE.

Я только что выполнил образец запроса в том же сценарии, и он отлично работает.

SELECT * FROM user u INNER JOIN team t ON t.teamName = u.companyName
INNER JOIN team_user tu ON tu.userId = u.id WHERE tu.userId = :id;

Вы уверены, что у team_user будет столбец с именем id. Потому что в присоединении вы используете столбец userId в team_user, а в WHERE используете столбец id в team_user

РЕДАКТИРОВАТЬ: в рабочей среде sql он работает нормально, я думаю, проблема связана с полем id, в результате соединения есть два столбца с тем же именем, что и id (идентификатор таблицы пользователя и идентификатор таблицы team_user). Это создает проблему. Если вы измените запрос выбора с необходимыми значениями, вместо этого выберите *, и поместите псевдоним для столбца с именем как id.

То есть:

SELECT u.id as uid, (other needed values) FROM user u INNER JOIN team t ON t.teamName = u.companyName
INNER JOIN team_user tu ON tu.userId = u.id WHERE tu.userId = :id;
0
rTom 8 Июн 2021 в 15:58

Это был правильный ответ. Спасибо @crig за комбинированное решение.

   @Query(value = "SELECT firstName, lastName, email \n" +
            "FROM user u\n" +
            "INNER JOIN team t ON (t.teamName = u.companyName) \n" +
            "INNER JOIN team_user tu ON (u.id = tu.userId) \n" +
            "WHERE tu.id = :id", nativeQuery = true)
    List <String> getTeamUsers(@Param("id") long id);
0
DJD 8 Июн 2021 в 16:02