개요
쿼리 성능을 개선하는 방법 중 하나는 이미 선언된 값은 그대로 사용하는 것이다.
매개변수로 넘어왔구나 이미 알고 있는 값을 DB에서 조회하는건 불필요하다. 이 밖에도 Entity보다 DTO로 필요한 필드만 가져오거나 where 및 join 문에 인덱스가 있는 필드만 사용하는 등의 방법이 있다.
본 글에서는 Expressions 클래스로 Querydsl에서 select문에서 상수를 사용하는 방법을 알아보자
com.mysema.query.support.Expressions 클래스는 동적 표현식 생성을 위한 클래스이다.
constant()
constant 표현식은 Entity에 선언되지 않은 필드를 상수로 반환하고 싶을 때 사용한다.
Expressions.constant(value) 형태로 사용할 수 있고 Expressions.as(source, alias)와 함께 사용해서 alias를 지정할 수 있다.
public List<Tuple> findMembersWithConstant() {
return queryFactory
.select(
member.name,
member.age,
Expressions.as(Expressions.constant("S"), "rank") // 상수 "S" 추가
)
.from(member)
.fetch();
}
name | age | rank |
김찬빈 | 30 | S |
constantAs()
constantAs()는 조회 조건에 사용됐던 값을 select에서도 쓸 때 사용하면 좋다.
xrpessions.constantAs(source, alias) 첫 번째 파라미터에는 조회에 사용될 상수값, 두 번째 파라미터에는 QClass의 필드를 사용할 수 있다. 대신 DTO필드와 Entity의 필드 이름, 타입이 동일해야 한다. 만약 일치하지 않으면 컴파일 에러가 발생한다.
public class MemberDto {
private String name;
private int age;
private String rank;
}
public List<Tuple> findMembersWithConstant() {
return queryFactory
.select(Projections.fields(MemberDto.class,
member.name,
Expressions.constantAs("S", member.rank))
.from(member)
.fetch();
}
asNumber(), asString()
특정 타입의 상수를 명시적으로 생성할 수 있다. 이 방식을 사용하면 select에서 간단하게 상수를 사용할 수 있다.
public List<Tuple> findMembersWithConstant() {
return queryFactory
.select(
member.name,
member.age,
Expressions.asString("S").as("rank"),
Expressions.asNumber(177).as("height")
)
.from(member)
.fetch();
}
name | age | rank | height |
김찬빈 | 30 | S | 177 |
numberTemplate(), stringTemplate(), booleanTemplate()
SQL 함수나 정규 표현식을 포함한 상수를 만들 때 유용하다.
public List<Tuple> findMembersWithConstant() {
return queryFactory
.select(
Expressions.stringTemplate("CONCAT({0}, '_', {1})", member.name, "'최고'")).as(member.name),
Expressions.numberTemplate(Integer.class, "10 + 20").as(member.age),
member.height.as("height"),
Expressions.booleanTemplate("{0} >= 180", member.height).as("isTall")
)
.from(member)
.fetch();
}
name | age | height | isTall |
김찬빈_최고 | 30 | 177 | false |
참조
https://dzone.com/articles/6-simple-performance-tips-sql
http://querydsl.com/static/querydsl/3.4.0/reference/ko-KR/html/ch03.html
http://querydsl.com/static/querydsl/4.0.7/apidocs/com/querydsl/core/types/dsl/Expressions.html
https://jojoldu.tistory.com/523
'JPA' 카테고리의 다른 글
Spring Data JPA - 외래키(Foreign Key)를 복합 기본키(Composite Primary Key)로 사용하기 (1) | 2024.11.08 |
---|---|
JPA - 하나의 컬럼에 여러 개의 데이터를 저장하기 (0) | 2023.05.08 |
JPA - Querydsl를 사용해 DTO 받는 방법 (0) | 2023.03.02 |
Spring Data JPA - Auditing으로 생성일, 수정일 자동화하는 법 (0) | 2022.12.02 |