QueryBuilder는 TypeORM이 제공하는 강력한 기능중 하나로, sql query를 작성하고 실행하여 자동으로 변환된 Entity를 가져올 수 있다
이때까지 써왔던 findOne, Find, Save, Insert 와 같은 Repository API 같은 경우는 => 로직이 간단하거나 추상적인 쿼리에 쓰기 적합했다.
하지만 다양한 sql query문을 작성하려면 한계가 분명했다. 이를 보완하기 위해 QueryBuilder 를 써볼 거다.
공식문서 확인하기
현재 typeORM 이 업데이트 되면서 getConnection은 deprecated 돼서 사용하지 못한다! => 대신, DataSource 써야 됨.
// 커넥션 사용 (deprecated 됨. 현재 쓰지 못함)
import {getConnection} from "typeorm";
const user = await getConnection()
.createQueryBuilder()
.select("user")
.from(User, "user")
.where("user.id = :id", { id: 1 })
.getOne();
// 1. Using DataSource: (앞으로 이거 쓸거임)
const user = await dataSource
.createQueryBuilder()
.select("user")
.from(User, "user")
.where("user.id = :id", { id: 1 })
.getOne()
// 2. Using entity manager:
const user = await dataSource.manager
.createQueryBuilder(User, "user")
.where("user.id = :id", { id: 1 })
.getOne()
// 3. Using repository:
const user = await dataSource
.getRepository(User)
.createQueryBuilder("user")
.where("user.id = :id", { id: 1 })
.getOne()
await this.dataSource
.createQueryBuilder()
.insert()
.into(Image)
.values(
imageUrls.map((url) => ({
url,
product: {
id: result.id,
},
})),
)
.execute();
await this.productsRepository
.createQueryBuilder('product')
.leftJoinAndSelect('product.subCategory', 'subCategory')
.leftJoinAndSelect('product.artist', 'artist')
.leftJoinAndSelect('product.images', 'image')
.orderBy('product.createdAt', 'DESC')
.getMany();
await this.followRepository
.createQueryBuilder('follow')
.delete()
.from(Follow)
.where('artistId = :artistId', { artistId })
.andWhere('userId = :userId', { userId: user.id })
.execute();
await this.artistsRepository
.createQueryBuilder('artist')
.select('artist.id')
.addSelect('artist.name')
.addSelect('artist.mainImage')
.where('artist.id IN (:...artistIds)', { artistIds })
.getMany();