[TypeORM] QueryBuilder

mj·2023년 11월 11일

typeORM

목록 보기
1/1

QueryBuilder는 TypeORM이 제공하는 강력한 기능중 하나로, sql query를 작성하고 실행하여 자동으로 변환된 Entity를 가져올 수 있다

이때까지 써왔던 findOne, Find, Save, Insert 와 같은 Repository API 같은 경우는 => 로직이 간단하거나 추상적인 쿼리에 쓰기 적합했다.

하지만 다양한 sql query문을 작성하려면 한계가 분명했다. 이를 보완하기 위해 QueryBuilder 를 써볼 거다.

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()

여러값 insert 하기

 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();

delete

await this.followRepository
      .createQueryBuilder('follow')
      .delete()
      .from(Follow)
      .where('artistId = :artistId', { artistId })
      .andWhere('userId = :userId', { userId: user.id })
      .execute();

In [...array]

await this.artistsRepository
      .createQueryBuilder('artist')
      .select('artist.id')
      .addSelect('artist.name')
      .addSelect('artist.mainImage')
      .where('artist.id IN (:...artistIds)', { artistIds })
      .getMany();

0개의 댓글