이번에는 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명을 입력하고 두번째부터 값을 입력하면, 값 입력 순서대로 정렬된다. 오름차순, 내림차순이 아닌 원하는 정렬 순서가 있을 경우 사용할 수있다.