QueryBuilder활용 - ProjectMember/Project/Role테이블 조인@Entity()
export class ProjectMember{
@PrimaryColumn()
userSeq: number;
@PrimaryColumn()
projectSeq: number;
@ManyToOne(() => User, (user) => user.userSeq)
@JoinColumn({name: 'userSeq'})
user:User;
@ManyToOne(() => Project, (project) => project.projectSeq, {eager: true})
@JoinColumn({ name: 'projectSeq'})
project: Project;
@ManyToOne(() => Role, (role) => role.roleId, {eager: true})
@JoinColumn({name: 'roleId'})
role:Role
}
const query = this.projectMemberEntity
.createQueryBuilder('projectMember')
.innerJoinAndSelect('projectMember.project','project')
.where('projectMember.userSeq = :userSeq', {userSeq})
.getMany();
return query;
- 당시 생각
Entity에 @ManyToOne으로 관계를 맺어주었고, 실제 DB에도 관계가 형성되어 eager를 사용하지 않는 user를 제외한 project와 role이 조회될 것이라고 생각함
- 원인
QueryBuilder를 사용하면 커스터마이징이나 최적화가 가능하기 때문에 개발자가 명시하지 않은 테이블에 대해서는 조회를 하지 않음
내가 작성한 쿼리에서는 projectmember테이블과 project테이블만 innerJoinAndSelect()를 이용하여 조회하고 있으므로 role은 따로 조회를 하지 않음