이번에는 NestJs에서 TypeOrm을 사용 시, queryBuilder을 통한 select 작성법을 간단하게 작성할려고 한다.

 

기존에 만들어 놓은 test라는 entity가 있을 시, 사용하여 repository를 만든다
export class TestService {
  constructor(
    @InjectRepository(test)
    private readonly testRepository: Repository<test>,
  ) {}
  	async getValue(){
    let value = await this.testRepository.createQueryBuilder()
    .select()
    .where()
    .orderBy()
    .getOne()
    }
  }

 

위의 형태가 기본이고 안에 들어가는 내용에 대하여 차례대로 설명할려고 한다.

 

1. select

기본적으로 select에는 아무것도 입력하지 않을 시 *로 인식되어 모든 컬럼이 출력되고, 보고싶은것만 보고 싶다면 select안에 입력하면 된다.

.select('table.column')

.select(['table.column1','table.column2','table.column3'])

// 이방식으로는 검색한 것을 count 할 수 있다.
.select("COUNT(*)")
.getCount()

 

2. where

가장 많이 쓰는 where 절에 경우 기존 sql과 똑같은 형태로 사용하지만 값을 넣는 부분이 조금 다르다.

 

.where("columnName = :value", {value: '값1'})

.where("columnName like :value", {value: '%값2%'})

.where("columnName  BETWEEN :value1 AND :value2", {value1: '값1', value2: '값2'})

.where("columnName in (:value)",{value: []})

 

위와 같이 where절 칸에 첫번째로 식을 넣고 :value의 형태로 변수명을 입력하고 두번째칸에 변수명에 입력될 값을 넣는다.

 

where을 여러개 사용할 경우에는,

.andWhere()

.orWhere()

.andWhere(
  new Brackets((qb) => {
   qb.where()
     .orWhere()
     .orWhere();
  })
)

 

위와 같은 방식을 사용할 수 있다.

andWhere은 where절에 and를 사용했을 경우, orWhere은 or을 사용했을경우,

마지막의 Bracket을 사용한 경우는 ()로 묶는 등의 방식으로 or이나 and 후 그것에 대한 내용을 다시 and,or하고 싶은 경우 사용할 수 있다.

이러한 방식을 사용하여 가장 간단하게 출력하는 방식은

export class TestService {
  constructor(
    @InjectRepository(test)
    private readonly testRepository: Repository<test>,
  ) {}
  	async getValue(){
    
    let value = await this.testRepository.createQueryBuilder()
    .select()
    .where("columnName = :value", {value: '값1'})
    .orderBy()
    .getOne()  or .getMany()
    }
  }

 

와 같은 방식으로 where절을 사용후 정렬하고 getOne, getMany 를 사용하여 출력한다.

 

만약 변수의 유무에 따라 동적으로 where절을 입력하고 싶은 경우

export class TestService {
  constructor(
    @InjectRepository(test)
    private readonly testRepository: Repository<test>,
  ) {}
  	async getValue(data1: string, data2: string){
    
    .const value = this.testRepository.createQueryBuilder()
    .select()
    .where("columnName = :value", {value: '값1'});
    
    if(data1){
      value.andWhere("columnName = :data", {data: data1})
    }
    if(data2){
      value.andWhere("columnName = :data", {data: data2})
    }
    return await value.orderBy().getOne();
   }
  }

 

위와 같은 방식으로 createQueryBuilder를 먼저 만들어 내부에 변하지 않는 select문 where을 미리 입력 후 if절을 사용하여 동적 조건을 추가할 수 있다.

 

3.  orderBy

orderBy의 경우에는 원래 정렬하듯이 사용하면 된다.

.orderBy("columnName","DESC")

.orderBy("FIELD(columnName, '값1', '값2'))

 

와 같이 정렬 시킬 수 있다.

위의 orderby는 기존에 사용하던 오름차순, 내림차순이고,

아래의 orderby는 mysql에서 사용하는 field 정렬 방식이다. field 첫번째에 column명을 입력하고 두번째부터 값을 입력하면, 값 입력 순서대로 정렬된다. 오름차순, 내림차순이 아닌 원하는 정렬 순서가 있을 경우 사용할 수있다.