JdbcTemplate как использовать join on
У меня имеется 3 таблицы: film, director, film_has_director.
CREATE TABLE film
(
id INT NOT NULL AUTO_INCREMENT primary key,
name varchar(50) not null,
genre varchar(100) not null,
description varchar(100) not null
);
CREATE TABLE director
(
d_id INT NOT NULL AUTO_INCREMENT primary key,
a_name varchar(50) not null
);
CREATE TABLE film_has_director
(
id INT NOT NULL,
d_id INT NOT NULL,
foreign key (id) references film(id),
foreign key (d_id) references director(d_id)
);
Я хотел реализовать поиск фильмов по названию и по режиссеру. С первым вариантом не возникло никаких проблем т.к использовалась только одна таблица film.
public List<Film> findByName(String name) {
return jdbcTemplate.query("SELECT * FROM film WHERE Name=?", new Object[]{name}, new FilmMapper());
}
Но далее я пришел к тому что не знаю как использоваться join on в JdbcTemplate. Необходимо выполнить следующий запрос:
select film.*, director.a_name
from film
join film_has_director
on film_has_director.id = film.id
join director
on director.d_id = film_has_director.d_id
WHERE a_name = "director1"
Как это можно реализовать?
Код: FilmMapper
@Component
public class FilmMapper implements RowMapper<Film> {
@Override
public Film mapRow(ResultSet resultSet, int i) throws SQLException {
Film film = new Film();
film.setFilm_id(resultSet.getInt("Id"));
film.setName(resultSet.getString("Name"));
film.setGenre(resultSet.getString("genre"));
film.setDescription(resultSet.getString("description"));
return film;
}
}
Ответы (1 шт):
Автор решения: Темка тоже
→ Ссылка
public List<Film> findByDirectorName(String name) {
return jdbcTemplate.query(" select f.* from film f " +
" inner join film_has_director fd on fd.id = f.id " +
" inner join director d on d.d_id = fd.d_id " +
" WHERE d.a_name = ?", new Object[]{name}, new FilmMapper());
}
Правда данный запрос предполагает, что у фильма не более одного директора. Версия, где эта проблема не помеха:
public List<Film> findByDirectorName(String name) {
return jdbcTemplate.query(" select f.* from film f" +
" where f.id in " +
" ( select fd.id film_has_director fd " +
" inner join director d on d.d_id = fd.d_id " +
" where d.a_name = ?)", new Object[]{name}, new FilmMapper());
}