FilmWithActor로 fetch 시 select와 생성자의 매개변수 순서가 다를 경우 map이 정상적으로 이루어 지지않는 케이스
안녕하세요 강의를 재밌게 수강하던 도중 궁금증이 생기어 질문 드립니다.
질문
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;
}
안녕하세요 FetchGroups에서 Multiset방식 사용하면 어떤가 해서 물어봅니다
0
60
1
monosoul jooq plugin-docker registry 변경
1
101
3
질문) jOOQ 프로젝트에서 CI/CD 자동화 문의
1
174
3
generate dao 를 통한 삽입 시 pk auto-increment 가 적용되지 않습니다
1
109
1
jooq+flyway에서 질문드립니다
0
249
2
안녕하세요 생성일,생성자,수정일,수정자는 자동으로 해주는 기능이 있을까요?
0
206
2
[사례] Maven에서 TestContainers 플러그인 적용시 예외발생
0
142
0
Routines 관련 질문
1
159
2
JOOQ 환경설정 중에 db 패스워드 관련 질문입니다.
1
173
1
Sakila DB 도커 컴포즈 구성 시 팁
1
152
1
DB 벤더별 내장함수에 대한 방언 지원 듣고 질문드려요
1
176
1
인텔리제이 테마 질문
2
425
3
kotlin jOOQ , 컴파일시 힙메모리 부족
0
523
2
pojo 에 setter 가 없는 경우가 있을까요?
1
189
1
from절 subquery table filed nullable 처리
1
221
1
kotlin mapping error
0
517
4
db column은 not null로 되어 있는데 kotlin에서 pojo가 다 nullable로 생성되요.
0
514
1
하나의 디비를 여러 백엔드 서버가 필요로 할 때, flyway 관리
1
887
5
dslContext 작성 시 fetchGroups 이렇게 작성해도 될까요?
2
638
6
update with dto 질문
1
268
1
R2DBC 환경에서 jOOQ generate 된 Dao를 사용할 수 있는 방법이 있을까요?
2
1244
3
IDE로 스프링부트 실행없이 jooq로 짠 쿼리 결과를 바로 확인하는 방법이 있을까요?
1
503
1
build.gradle.kts
3
757
2
마리아 DB 쓰시는분들은 mysql 파일 쓰시면됩니다.
1
371
1





