해결된 질문
작성
·
53
1
안녕하세요 강의를 재밌게 수강하던 도중 궁금증이 생기어 질문 드립니다.
select
의 row 매개변수의 순서와 FilmWithActor의 생성자
매개변수의 순서가 각 테이블 타입에 매칭되지 않을 경우 mapping이 정상적으로 이뤄지지 않는 현상이 있어
별도의 해결 방법이나 대안이 있는지 여쭙고 싶습니다.
정상 케이스(Film - FilmActor - Actor)
dslContext.select(
DSL.row(FILM.fields()),
DSL.row(FILM_ACTOR.fields()),
DSL.row(ACTOR.fields())
).from(FILM)
.join(FILM_ACTOR)
.on(FILM.FILM_ID.eq(FILM_ACTOR.FILM_ID))
.join(ACTOR)
.on(FILM_ACTOR.ACTOR_ID.eq(ACTOR.ACTOR_ID))
.offset((page - 1) * pageSize)
.limit(pageSize)
.fetchInto(FilmWithActor.class);
public class FilmWithActor {
private final Film film;
private final FilmActor filmActor;
private final Actor actor;
public FilmWithActor(Film film, FilmActor filmActor, Actor actor) {
this.film = film;
this.filmActor = filmActor;
this.actor = actor;
}
// ...
문제 케이스(Film - Actor - FilmActor)
dslContext.select(
DSL.row(FILM.fields()),
DSL.row(FILM_ACTOR.fields()),
DSL.row(ACTOR.fields())
).from(FILM)
.join(FILM_ACTOR)
.on(FILM.FILM_ID.eq(FILM_ACTOR.FILM_ID))
.join(ACTOR)
.on(FILM_ACTOR.ACTOR_ID.eq(ACTOR.ACTOR_ID))
.offset((page - 1) * pageSize)
.limit(pageSize)
.fetchInto(FilmWithActor.class);
public class FilmWithActor {
private final Film film;
private final FilmActor filmActor;
private final Actor actor;
public FilmWithActor(Film film, Actor actor, FilmActor filmActor) {
this.film = film;
this.filmActor = filmActor;
this.actor = actor;
}
// ...
답변 1
1
하디님 안녕하세요
강의에서는 일부 row를 그룹핑해서 다른 객체로 만들 수 있다는걸 보여주기 위해서 위의 방식으로 소개했었는데요.
테이블 자체를 select하는 경우에는 Tables as SelectField 방식으로 처리하는것을 추천드립니다. 🙂
테이블 객체를 field로 사용하는 경우 아래와 같이 mapping 할 때 테이블 명으로 매핑할 클래스 필드명을 찾아서 매칭해주기 때문에 순서를 고려하지 않으셔도 됩니다.
예시 1) 위의 "Table as SelectField"를 사용한 경우
예시 2) 강의의 DSL.row를 사용한 경우
강의오픈 후에 이부분 설명이 아쉽다고 생각해서 강의노트에 추가했었는데요.
이부분은 추후에 다른분들도 어떻게 잘 알 수 있을지 고민해보도록 하겠습니다.
테이블이 아닌경우 DSL.row()와 매퍼를 적절히 사용해주시면 됩니다.
dslContext.select(
DSL.row(
FILM.FILM_ID,
FILM.TITLE,
FILM.DESCRIPTION
).mapping(SimpleFilmInfo::new)
)
.from(FILM)
.where(FILM.FILM_ID.eq(id))
.fetchOneInto(SimpleFilmInfoWrapper.class);
//
class SimpleFilmInfoWrapper {
private SimpleFilmInfo simpleFilmInfo;
}
깔끔한 답변 감사합니다